美文网首页
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,内部会做很多处理,影响性能。

相关文章

  • iOS - ARC环境下dealloc/didReceiveMe

    block没那么难(三):block和对象的内存管理 一、iOS开发 ARC下dealloc的使用 ARC下,系统...

  • Block补充

    block声明/定义 block的作用:保存一段代码 添加block属性 block内存管理(非ARC) 首先了解...

  • 九、自动引用计数ARC @GeekBand

    ARC OC默认的内存管理机制 受ARC管理的对象 OC对象指针 Block指针 使用attribute((NSO...

  • Block 内存管理(ARC)

    上篇文章介绍了MRC环境下,Block内存管理,紧接着此篇介绍ARC环境下Block的内存管理。 介绍之前我们需要...

  • Block

    block的内存管理: 无论当前环境下是arc还是mrc,只要block没有访问外部变量,block始终在全局区 ...

  • Block

    Block block内存管理 无论是MRC还是ARC,只要block没有访问外部变量,blokc始终在全局区 M...

  • iOS面试题-block

    block的内存管理 无论当前环境是ARC还是MRC,只要block没有访问外部变量,block始终在全局区 MR...

  • Block 03 - 内存管理

    Block 03 - 内存管理 Block 的 copy 在 ARC 环境下,编译器会根据情况自动将栈上的 Blo...

  • 5.Block的内存管理 内存管理

    内存管理 无论当前环境是ARC还是MRC,只要block没有访问外部变量,block始终在全局区 MRC情况下 b...

  • ARC下内存泄露总结

    1、Block的循环引用   在iOS4.2时,Apple推出ARC内存管理机制。这是一种编译期的内存管理方式,在...

网友评论

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

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