10

在由属性强烈定义的 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

4 回答 4

15

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

__weak MyClass *weakSelf = self;

[tapBlockView setTapBlock:^(UIImage* image) {
    __strong MyClass *strongSelf = weakSelf;
    if(strongSelf) {
        [strongSelf.myImageArray addObject:image];
    }
}];
于 2012-11-06T19:21:45.000 回答
9

尝试第 2 和第 3 的组合。

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf.myImageArray addObject:image];
}
于 2012-11-06T19:17:35.377 回答
1

在您的情况下,您只需要引用一个由 引用的数组self,因此:

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

如果self.myImageArray不在不同时间返回不同的数组引用,则可以正常工作。没有循环:当前对象引用数组和块,而块又引用数组。

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

于 2012-11-06T19:34:28.460 回答
0

你的第二个和第三个看起来是正确的。第二个有效,因为您没有创建数组的副本,所以它仍然指向原始数组。第三个有效,因为对 self 的引用很弱。

于 2012-11-06T19:16:29.450 回答