简单理解block的种类

块(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");
};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容