Iphone 使用块时,避免保留循环的正确方法是什么

Iphone 使用块时,避免保留循环的正确方法是什么,iphone,objective-c,automatic-ref-counting,block,weak,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)

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


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

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

尝试第二个和第三个的组合

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

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

__weak MyClass *weakSelf = self;

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

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

NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image)
                          {
                             [array addObject:image]; // No cycle
                          }];
如果
self.myImageArray
在不同的时间不返回不同的数组引用,则可以正常工作。没有循环:当前对象引用数组和块,而块又引用数组


如果
self.myImageArray
在不同的时间返回不同的数组引用,则使用对
self
的弱引用,您的案例3。

第二个案例仅在
self.myImageArray
返回对ivar的直接引用时有效。这可能不是一个安全的假设。块就像函数指针。当你不再需要它时,你就不能将块设置为nil吗?我不明白你为什么要再次变为_强?我想只有这个代码就足够了?[weakSelf.myImageArray addObject:image];返回到
\u strong
的原因是,如果执行块的第一行时
weakSelf
仍处于活动状态,它将在块的其余执行期间继续保持活动状态。如果打开警告,则您将看到为什么需要使用_strong:弱变量可以在任何点消失,包括在调用MeIfSelf.MyIVaLeLead的中间,这肯定会引起麻烦。请注意这是唯一有效的,如果在块的第一行使用弱自,如果你先做其他的事情,那么你需要KAAN的答案。
NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image)
                          {
                             [array addObject:image]; // No cycle
                          }];