简单理解block的种类
2019-12-04 本文已影响0人
蜗蜗牛在奔跑
块(Block)分为三类:
- 栈块
- 堆块
- 全局块
1. 栈block
定义块的时候,其所占内存区域是分配在栈中的,而且只在定义它的那个范围内有效:
void (^block)();
if ( /* some condition */ ) {
block = ^{
NSLog(@"Block A");
};
} else {
block = ^{
NSLog(@"Block B");
};
}
block();
上面定义的两个块只在if else语句范围内有效,一旦离开了最后一个右括号,如果编译器覆写了分配给块的内存,那么就会造成程序崩溃
2. 堆block
为了解决这个问题,我们可以给对象发送copy消息,复制一份到堆里,并自带引用计数:
void (^block)();
if ( /* some condition */ ) {
block = [^{
NSLog(@"Block A");
} copy];
} else {
block = [^{
NSLog(@"Block B");
} copy];
}
block();
3. 全局block
全局块声明在全局内存里,而不需要在每次用到的时候于栈中创建。
void (^block)() = ^{
NSLog(@"This is a block");
};