美文网首页iOS开发实用技术iOS 易混淆的点iOS
关于Block内部要不要使用weakSelf的几种情况

关于Block内部要不要使用weakSelf的几种情况

作者: iOSWoden | 来源:发表于2016-01-13 20:07 被阅读7905次

    我们知道当对block使用不当时会造成循环引用导致内存泄露,这里列出几种使用block到底会不会引起循环引用的例子,通过重写控制器dealloc,当控制器被pop看有没有调用来判断。

    • block是控制器的属性,如果block内部没有使用weakSelf将会造成内存泄露
    self.testBlock = ^()
        {
            NSLog(@"%@",self.mapView);
        };
        self.testBlock();
    
    • 把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露
        self.testBlock = ^()
        {
            [weakSelf test];
        };
    -(void)test
    {
        NSLog(@"%@",self.mapView);
    }
    
    
    • 当block不是self的属性时,block内部使用self也不会造成内存泄露
        TestBlock testBlock = ^()
        {
            NSLog(@"%@",self.mapView);
        };
    [self test:testBlock];
    
    • 当使用类方法有block作为参数使用时,block内部使用self也不会造成内存泄露
        [WDNetwork testBlock:^(id responsObject) {
            
            NSLog(@"%@",self.mapView);
        }];
    

    以上几个是我通过控制器pop时,通过有没有走dealloc方法测出来的。

    这里还漏了,后来学习RAC发现外面用弱引用weakSelf,在block内部还应该用强引用指向外面的weakSelf

    相关文章

      网友评论

      • K哥的贼船:我在首页写了弹窗,弹窗不是self的属性,里面用了self也会不dealloc,所以貌似只要有self都要weakself代替,除非类里的block
        iOSWoden:@凋了丶这碎念 不大清楚你的实现方式,所以不是很清楚,你可以用MLeaksFinder库测试下
        iOSWoden:@走近科学探索发现 第二个例子是因为test方法是被weakSelf调用的。在test里面用self实际上就是weakSelf
        走近科学探索发现:弹窗加载到控制器上应该会被强应用一次的。
        我是不太明白 第二种情况,[ weakself test],在test方法里再用self 为啥就不会。难道这个self的引用属于 test?
      • 卓敦:我无论什么block,都加了weakself。:smile: 。没影响吧
        K哥的贼船:@iOSWoden 貌似多线程才需要加strong防止释放了,但是为了不出意外都加strong好点
        iOSWoden:@卓敦 这样多费劲。而且在block内部最好用strong再引用weakSelf防止被释放了
      • 风里的毛毛虫:类的block成员或成员变量的block成员内使用了self要弱引用 否则会造成循环引用并且不能开环
      • 独木舟的木:如果 NSArray 的一个实例变量 _array 被控制器所拥有,使用数组的遍历方法 enumerateObjectsAtIndexes:options:usingBlock: 在Block中使用到 self 会引起循环引用吗?
        YungFan:这些block变量都是临时创建使用的,保存在栈上,出了作用域便会自动释放,不存在引用循环的问题。
      • 温暖的男人:self.testBlock(self.tag);
        这种情况呢
      • 哈哈大笑呼呼呼呼:你的排版怎么整的??
        iOSWoden:@M了个K 哈?简书自带的markdown编辑的
      • 秋S寂S:简单的说就是有block的时候,先看他是不是直接或者间接的作为一个属性存在的,如果是,就需要转换,如果不是就不用转换。
      • 山是水的故事:这个循环引用的关键还是看控制器是否持有该block吧,
      • Auditore:卧槽 真是踏破铁鞋无觅处 得来全不费功夫 正好想找这个就找到了
        iOSWoden:@Auditore :grin:
      • cocoaroger:我一直都是所有的block都用了weakSelf,不明白其中原理
        cocoaroger:@iOSWoden 总结得挺好的,这些东西就要慢慢尝试
        iOSWoden:@roger_wu :grin: 之前接手旧项目时候发现有些控制器销毁不调用dealloc方法,顺带研究了下
      • ValienZh:只有当block直接或间接的被self持有时,才需要weak self。如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
        a6f3c7237f3f:@ValienZh 所以什么样的算作持有?(能不能很准确的说一下),谢谢
        cocoaroger:@ValienZh 基本上都会在block多次调用self的,使用strongSelf是指向Reactivecocoa的weakify和strongify的成对使用吗?
        清晨日暮:@ValienZh 简介明了!
      • dd916d1c1a4b:写的不错,学到东西了
      • Miaoz0070::+1:🏻
        iOSWoden:@Miaoz0070 :grin:

      本文标题:关于Block内部要不要使用weakSelf的几种情况

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