使用块时避免保留周期的正确方法是什么

时间:2012-11-06 18:47:43

标签: iphone objective-c automatic-ref-counting block weak

在NSMutableArray中添加由属性强定义的对象的正确方法是什么。

[tapBlockView setTapBlock:^(UIImage* image) {
   [self.myImageArray addObject:image]; // self retain cycle
}

如果我要创建像

这样的弱引用
__weak NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image) {
    [array addObject:image]; // If I will do this then how will I update original Array ?
}

我也试过

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf storeImageInaNewMethod:image]; // Calling SToreImageInaNewMethod
}

-(void)storeImageInaNewMethod:(UIImage*)image {
   [self.myImageArray addObject:image]; // This again retaining cycle
}

更新属性定义的原始对象的正确方法是什么?

4 个答案:

答案 0 :(得分:14)

在maddy回答之后 - 这是来自2012年WWDC关于GCD和异步编程的讲座:

__weak MyClass *weakSelf = self;

[tapBlockView setTapBlock:^(UIImage* image) {
    __strong MyClass *strongSelf = weakSelf;
    if(strongSelf) {
        [strongSelf.myImageArray addObject:image];
    }
}];

答案 1 :(得分:8)

尝试第2和第3组合。

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf.myImageArray addObject:image];
}

答案 2 :(得分:1)

在您的情况下,您只需要引用由self引用的数组,所以:

NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image)
                          {
                             [array addObject:image]; // No cycle
                          }];

正常工作提供 self.myImageArray不会在不同时间返回不同的数组引用。没有循环:当前对象引用数组和块,然后块引用数组。

如果self.myImageArray确实以不同的时间返回不同的数组引用,则使用对self的弱引用,您的情况为3。

答案 3 :(得分:0)

你的第二个和第三个看似正确。第二个是有效的,因为您没有创建数组的副本,因此仍然指向原始数组。第三个是有效的,因为对自我的提及很弱。