在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
}
更新属性定义的原始对象的正确方法是什么?
答案 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)
你的第二个和第三个看似正确。第二个是有效的,因为您没有创建数组的副本,因此仍然指向原始数组。第三个是有效的,因为对自我的提及很弱。