入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

——黑马程序员——OC中block访问外部变量

创建时间:2015-11-09 投稿人: 浏览次数:763

-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------

OC中block访问外部变量

int main(int argc, const char *argv[]) { 

@autoreleasepool {

int m = 10;

NSLog (@"m = %d", m);                //

NSLog (@"m的地址 = %p", &m); // 栈区

//定义变量,并赋值

void (^Block) () = ^{

// 在代码块内部定义 int m = 10; //栈区

//在block内部 m的值不允许修改

//内部访问外部m的值

NSLog (@"在block中访问:m = %d", m);

NSLog (@"在block中地址:&m = %p", &m); // block中的m存在堆区

};

//使用block变量

Block(); //此时打印出了blcok中的m值和地址

}

}

1、当Block被定义创建的时候,会以const的方式把外部变量栈区的m值拷贝到block所在的内存中(本程序是在堆区),以const方式拷贝的值是不允许修改的,

2、在block内部定义的变量存在栈区

3、在block内部访问外部变量,给变量加__block后可以修改变量值,因为__block 会不再以const常量的方式进行拷贝,修改变量值后,block及以后的代码使用的空间是堆区的空间,不再是栈区空间

1、block有全局block, 栈block,堆block之分,

2、全局变量在block内部可以修改

3、堆区block是对栈区的block拷贝来的,

4、block内部变量是只读的,修改时 需要给变量加__block

1、使用typedef 定义一个新的类型,给block变量起个别名

2、用新定义的类型作为函数的返回值

3、 定义block变量接收函数的返回结果

4、执行block

例:

//   (1)使用typedef 定义一个新的类型,给block变量起个别名

typedef void (^newType)();

// (2) block 类型作为函数返回值,newType是类型值

newType Test(){ 

newType w = ^{

NSLog(@"******");

NSLog(@"#####");

};

return  w;

};

// 主函数

int main (int atrc,  const char *argv[]) {

@autoreleasepool{

//(3) 定义block类型的变量接收返回结果

newType n = test();

//  执行block

n ();

}

return 0;

}

1、block助记符:inline

2、定义block变量的时候,形参类型及个数处可以加上形参名称

3、当作为方法的参数的时候 返回值类型必须写上


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。