专注iOS开发的小渣渣

简单理解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");
};

上一篇下一篇

猜你喜欢

热点阅读