Iphone 使用块时,避免保留循环的正确方法是什么
在属性强定义的NSMutableArray中添加对象的正确方法是什么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)
[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
}];