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

Tar*_*riq 10 iphone block objective-c weak automatic-ref-counting

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

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

如果我将创建弱引用之类的东西

__weak NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image) {
    [array addObject:image]; // If I will do this then how will I update original Array ?
}
Run Code Online (Sandbox Code Playgroud)

我也试过了

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

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

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

Kaa*_*glu 14

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

__weak MyClass *weakSelf = self;

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

  • 回退到`__strong`的原因是为了保证如果`weakSelf`在执行块的第一行时仍然存活,它将继续存在于块的执行的剩余部分. (6认同)

rma*_*ddy 8

尝试第2和第3组合.

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