-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中block访问外部变量
一、在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及以后的代码使用的空间是堆区的空间,不再是栈区空间
二、block使用注意事项
1、block有全局block, 栈block,堆block之分,
2、全局变量在block内部可以修改
3、堆区block是对栈区的block拷贝来的,
4、block内部变量是只读的,修改时 需要给变量加__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;
}
四、block的使用技巧和注意事项
1、block助记符:inline
2、定义block变量的时候,形参类型及个数处可以加上形参名称
3、当作为方法的参数的时候 返回值类型必须写上