Block 内存管理(ARC)

2018-07-03  本文已影响0人  cjdale

上篇文章介绍了MRC环境下,Block内存管理,紧接着此篇介绍ARC环境下Block的内存管理。

介绍之前我们需要知道ARC开发常识:

只要一个对象没有被强指针引用就会被销毁,默认局部变量都是强指针,存放在堆区。

1、定义一个block

打印结果为:

    <__NSGlobalBlock__: 0x106350088>

由此可以看出此时Block放在全局区

打印结果为:

    <__NSMallocBlock__: 0x600000252900>

由此可以看出此时Block放在堆区

打印结果为:

    <__NSGlobalBlock__: 0x102093088>

由此可以看出此时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,内部会做很多处理,影响性能。

上一篇 下一篇

猜你喜欢

热点阅读