美文网首页IOS开发
Block内存管理

Block内存管理

作者: 越天高 | 来源:发表于2020-08-10 16:58 被阅读0次

在平时的开发中我们经常使用block来传值和事件传递,但是block的使用很容易造成循环引用(我引用你 你引用我 就会造成循环引用),产生内存泄漏;
block很容易产生循环引用,跟执行或者不执行block无关。
只要是写了产生循环引用的代码,即使不执行,也会导致引用对象无法被释放,我们平时写block的生命属性的时候,会选择用copy或者是strong来使用,在MRC中我们会选择使用copy,在ARC中我们使用cop又或者使用strong都可以,最好使用还是strong因为copy的底层实现还是会进行一些判断,相比之后性能会差点。

  • 全局对象引用Block,也会导致对象销毁不了

  • block:(捕获机制)会自动把block代码块中的强指针 强引用.

  1. 我们定义的局部的block引用self的属性,是不会造成循环引用的,因为self本身没有对我们的block强引用,所以没有造成闭环
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    void (^block)(void) = ^{
        self.age++;
        NSLog(@"%d",self.age);
    };
    block();
}

- (void)dealloc
{
    NSLog(@"dealloc");
}
  • 如果我们用self引用我们的block那么会造成循环引用
/***********/
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    void (^block)(void) = ^{
        self.age++;
        NSLog(@"%d",self.age);
    };
    _block = block;
    
}

/******如果我们呢把block里面的self.age改成_age,
同样还是会造成循环引用,因为他的本质还是会调用 self=>_age
******/

  • 避免方法

如果我们在 定义一个weak使用的话就不会造成循环,
但是注意,如果block里面的操作有延时操作的话,不能直接使用weakSelf,
因为控制器有可能会销毁,这是再执行操作会造成拿不到数据
应该在里面再对这个弱指针强引用一次避免他提前销毁

 void (^block)(void) = ^
     {
//         __strong typeof (weakSelf) strongSelf = weakSelf;
        weakSelf.age = 90;
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
         {
             
             NSLog(@"----%d",weakSelf.age);
            //这时候的weakSelf已经是空的了,null
             NSLog(@"----%@",weakSelf);

         });
    };
    _block = block;
    block();

//我们在block中使用要再加上这句话
__strong typeof (weakSelf) strongSelf = weakSelf;
里面使用strongSelf这样保证了self不会在执行延时操作之前被销毁
  • 全局变量引用block也会造成循环

static  void(^globalBlock)(void);

 globalBlock = ^
    {
        NSLog(@"%ld", self.age);
    };

相关文章

  • Block内存管理实例分析

    Block内存管理实例分析 Block内存管理实例分析

  • Block内存管理

    对block自身内存的管理 对于block,有两个内存管理方法:Block_copy, Block_release...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • Block 使用总结

    Block 内存管理: Block 内存主要分派到 NSGlobalBlock(data area),NSMall...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

  • Block

    Block介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 一、Block介绍 1...

  • block的内存管理

    block的内存默认放在栈中,(开发人员不需要管理block内存),block所引用的对象的retainCount...

  • block的一些注意事项

    Block的使用注意: block的内存管理(注意循环引用,默认在栈中(不需要内存管理),通过copy就在在堆中,...

网友评论

    本文标题:Block内存管理

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