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
Block 内存管理(ARC)_第1张图片
image1

总结

只要block没有引用外部局部变量,block放在全局区
只要Block引用外部局部变量,block放在堆区.
block使用strong.最好不要使用copy,使用copy,内部会做很多处理,影响性能。

你可能感兴趣的:(Block 内存管理(ARC))