Objective-C ARC - 一种方法保留了自我&#39 ;?

时间:2015-09-08 23:29:02

标签: objective-c automatic-ref-counting

这是安全的吗?

__weak typeof (self) welf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [welf doStuff];
})

....

-(void)doStuff {
    [_member1 someMethod];
    ....
    [_member2 someMethodWithParam:_someCArray[1];];
}

据我了解ARC,对[welf doStuff]的实际调用应该没问题,因为welf将有效(并且方法调用将继续),或者它将是{{1}调用nil上的任何方法都是在Objective-C中定义的安全行为,所以看起来没问题。

然而,一旦我们进入nil,ARC是否会在方法调用期间保留doStuff?如果确实如此,我认为我们应该没问题......如果没有,那么self可以在方法调用的中途获得self,然后我们就会陷入困境点。

注意:我用谷歌搜索但是找不到任何明显的东西。也许它很难搜索?

谢谢!

2 个答案:

答案 0 :(得分:0)

您需要在块内创建对self的强引用,并在其上调用方法。

    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        typeof(self) strongSelf = weakSelf;
        [strongSelf doStuff];
    })

是的,Orion,您的问题由this question itselfthis particular anwswer

回答

答案 1 :(得分:-1)

事实证明我最终找到了答案,在这里:https://stackoverflow.com/a/18011581/234和此处:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#self

ARC下{p> self总是unsafe unretained,所以在我的例子中,它不安全,并且没有什么可以阻止它通过我的doStuff方法中途解除分配。哎哟