码迷,mamicode.com
首页 > 移动开发 > 详细

ios block常见的错误(二)——循环引用

时间:2015-11-12 10:08:33      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:

这篇博文继续block的常见错误——循环引用。

循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用

读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁?

示例代码1:

技术分享

* mark 将代码改为调用self的方法

-(NSMutableArray * (_myBlocks ===-=(^sum)(, ) = ^( x,  mark 对象被释放时自动调用
- (

技术分享

结果是不能正常释放的。读者不妨在xcode中试试。

产生原因在block代码中出现了self:

int(^sum)(int, int) = ^(int x, int y) {    return [self sum:x y:y];
};

此时sum的block对self强引用,在加上self对myBlocks强引用:

@property (nonatomic, strong) NSMutableArray *myBlocks;

以及sum block被添加到数组时,会被数组强引用:

[self.myBlocks addObject:sum];

这三个引用之间形成了循环引用,如下图:

技术分享

循环引用的结果就是对象无法被释放!

碰到这类问题,程序员如何解除循环引用呢?

有以下几种解决方案:

1.在block代码中不要引用self以及其他局部变量;如

int(^sum)(int, int) = ^(int x, int y) {    return [self sum:x y:y];
};

修改成

int(^sum)(int, int) = ^(int x, int y) {    return x + y;
};

 

2.使用__weak关键字,可以将局部变量声明为弱引用

如:

技术分享

- (instancetype)init
{
    self = [super init];    if (self) {        int(^sum)(int, int) = ^(int x, int y) {            return [self sum:x y:y];
        };
        [self.myBlocks addObject:sum];
    }    
    return self;
}

技术分享

修改为:

技术分享

- (instancetype)init
{
    self = [super init];    if (self) {
        __weak DemoObj *weakSelf = self;        int(^sum)(int, int) = ^(int x, int y) {            return [weakSelf sum:x y:y];
        };
        [self.myBlocks addObject:sum];
    }    
    return self;
}

技术分享

block的循环引用就说到这,下一篇继续来讲解block的常见错误


ios block常见的错误(二)——循环引用

标签:

原文地址:http://my.oschina.net/u/2361492/blog/529181

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!