
##Block存储域
根据BLock中是否引用了自动变量,可以将Block存储域分类:
- NSStackBlock - 存储在栈上
- NSGlobalBlock - 存储在全局数据区域
- NSMallocBlock - 存储在堆上
在MRC下
-
如果Block没有引用变量 或 在全局作用域的类型为NSGlobalBlock,如下:
int a = 11; void (^block1)() = ^{ NSLog(@"%d", a); }; int main(int argc, const char * argv[]) { @autoreleasepool { void (^block2)() = ^{ NSLog(@"%d",1); }; NSLog(@"block1 = %@ n block2 = %@", block1, block2); } return 0; }输出日志:
block1 = <__NSGlobalBlock__: 0x100001080> block2 = <__NSGlobalBlock__: 0x1000010c0>通过输出日志能看到,block1和block2都是NSGlobalBlock;其中 block1是在人全局作用域,block2则没有引用变量。
-
如果Block引用的自动变量,则类型为NSStackBlock,如下:
void addBlockToArray(NSMutableArray *arr) { int a = 11; void (^block)() = ^{ NSLog(@"%d", a); }; NSLog(@"%@", block); } int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray *arr = [NSMutableArray array]; addBlockToArray(arr); } return 0; }输出日志:
block = <__NSStackBlock__: 0x7fff5fbff7f0>
在非ARC下,用strong声明的block会copy,用retain声明的block则不会copy。

This work is licensed under a CC A-S 4.0 International License.




近期评论