带有自动变量值的匿名函数
五种变量:自动变量(局部变量)、函数参数、局部静态变量、全局静态变量、全局变量
其中能够在多次调用之间能够传递值的是:静态变量(局部、全局)、全局变量
Blocks的省略方式
Block省略 // 通过typedef简化Block类型
typedef int(^Block)(int);
Block b = ^(int a){
return a + 1;
};
Blocks的实现
将代码转化为普通的C函数代码来实现,核心是objc_msgSend函数,从对象持有类的结构体中,检索函数的指针并调用。Block即为Objective-C对象。
Blocks 截获自动变量的值
将自动变量保存到block结构体实例中
int num = 10;
void(^block)(void) = ^(){
// 截获所使用的自动变量的瞬间值
printf("inside num = %d\n",num);
};
num = 5;
block();
printf("outside num = %d\n",num);
__block (存储域类)说明符:修饰自动变量,使自动变量能在block内赋值。底层会生成一个 __block的结构体
__block int num = 10;
void(^block)(void) = ^(){
// 只有执行block才会修改赋值
num = 11;
};
printf("1: %d\n",num);
num = 5;
printf("2: %d\n",num);
block();
printf("3: %d\n",num);
Blocks使用静态变量
将静态变量指针static_val传递给结构体__main_block_imp1_0的构造函数并保存。
什么时候Block会从栈复制到堆
-
调用copy方法
-
block作为函数返回值
-
block赋值给__strong修饰符id类型的类或者Block类型成员变量
-
方法名中含有UsingBlock的Cocoa框架方法,或GCD中传递的block
如何避免Block的循环引用
__weak , 也可以使用__block, __block的优点就是可以控制释放,当不需要的时候只需要 = nil就能释放,缺点就是必须要执行block体,否则对象不会被释放
网友评论