Block 内存管理(ARC)

上篇文章介绍了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,内部会做很多处理,影响性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容