美文网首页
Block 内存管理(ARC)

Block 内存管理(ARC)

作者: cjdale | 来源:发表于2018-07-03 14:59 被阅读0次

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

    相关文章

      网友评论

          本文标题:Block 内存管理(ARC)

          本文链接:https://www.haomeiwen.com/subject/opgduftx.html