上篇文章介绍了MRC环境下,Block内存管理,紧接着此篇介绍ARC环境下Block的内存管理。
介绍之前我们需要知道ARC开发常识:
只要一个对象没有被强指针引用就会被销毁,默认局部变量都是强指针,存放在堆区。
1、定义一个block
-
Block 没有引用局部变量
void(^block)(void) = ^{ }; NSLog(@"%@", block);
打印结果为:
<__NSGlobalBlock__: 0x106350088>
由此可以看出此时Block放在全局区
-
Block 引用局部变量
NSInteger index = 0; void(^block)(void) = ^{ NSLog(@"%ld", index); }; NSLog(@"%@", block);
打印结果为:
<__NSMallocBlock__: 0x600000252900>
由此可以看出此时Block放在堆区
-
Block 引用静态变量
static NSInteger index = 0; void(^block)(void) = ^{ NSLog(@"%ld", index); }; NSLog(@"%@", block);
打印结果为:
<__NSGlobalBlock__: 0x102093088>
由此可以看出此时Block放在全局区
-
Block 引用全局变量
NSInteger a = 0;//全局变量 void(^block)(void) = ^{ NSLog(@"%ld", a); }; NSLog(@"%@", block);
打印结果为:
<__NSGlobalBlock__: 0x102197088>
由此可以看出此时Block放在全局区
2、定义属性保存Block
由上面所说,ARC环境下默认局部变量都是强指针,存放在堆区,那属性保存block是否可以用weak修饰呢?
@property (nonatomic,weak) void(^block)(void);
NSInteger a = 0;
void(^block)(void) = ^{
NSLog(@"%ld", a);
};
self.block = block;
NSLog(@"%@", self.block);
打印结果为:
<__NSMallocBlock__: 0x600000252570>
此时再去访问self.block, 就会出现崩溃
image
image1
总结
只要block没有引用外部局部变量,block放在全局区
只要Block引用外部局部变量,block放在堆区.
block使用strong.最好不要使用copy,使用copy,内部会做很多处理,影响性能。
网友评论