非作者原著 来自摘抄
参考文献
分为3类块
- 栈块
- 堆块
- 全局块
block根据分配的内存位置分为栈块 堆块 全局块
1.如果一个block中引用了全局变量 或者么有引用任何外部变量 (属性 实例变量 局部变量) 那么该block为全局块
2.其它引用情况(局部变量 实例变量 属性)为栈块
3.前提是在block创建的时候 在赋值给变量之后 在mrc下依然是栈块 而在arc下就变成了堆块
栈块
定义块的时候 其所占内存区域是分配在栈中的 而且只在定义它的那个范围内有效
void (^block)();
if ( /* some condition */ ) {
block = ^{
NSLog(@"Block A");
};
} else {
block = ^{
NSLog(@"Block B");
};
}
block();
堆块
全局块
全局块声明在全局内存里 不需要再每次用到的时候于栈中创建
void (^block)() = ^{
NSLog(@"This is a block");
};
不管是对block进行retain copy release
block的引用计数都不会增加 始终为1
总结
在创建block的时候(MRC和ARC通用)
1.如果在一个block中引用了全局变量 或者没有引用任何外部变量(局部变量 属性 实例变量)那么block就是全局块
2.其他引用情况(局部变量 属性 实例变量)为栈块
在将block对象赋值给其他对象^(oBlock)()
的时候(ARC)
1.如果block是栈块 那么
^(oBlock)()
就变成堆块(因为Clang编译器帮我们往block发送了copy消息)
2.如果block是全局块 那么^(oBlock)()
也是全局块 如果block是堆块 那么^(oBlock)()
也是堆块
3.如果仅把创建完的block当做方法参数使用(不进行其他赋值引用) 那么block的类型不变
在将block对象赋值给其他对象^(oBlock)()
的时候(MRC)
1.block是什么
^(oBlock)()
是什么
网友评论