Objective c 目标-C弧-方法是否保留';自我';?

Objective c 目标-C弧-方法是否保留';自我';?,objective-c,automatic-ref-counting,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];]; } 据我所知,对[welf doStuff]的实际调用应

这样做安全吗

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

....

-(void)doStuff {
    [_member1 someMethod];
    ....
    [_member2 someMethodWithParam:_someCArray[1];];
}
据我所知,对
[welf doStuff]
的实际调用应该是可以的,因为
welf
要么是有效的(方法调用将继续),要么是
nil
——在
nil
上调用任何方法在Objective-C中定义为安全行为,所以这似乎是可以的

然而,一旦我们进入
doStuff
,ARC是否会导致
self
在方法调用期间被保留?如果是的话,我想我们应该没事。。。如果没有,那么
self
可能会在方法调用的中途得到
dealloc
,然后我们就会处于不利位置

注意:我在谷歌上搜索了这个,但没有找到任何明显的东西。也许只是很难找到


谢谢

事实证明,我最终在这里和这里找到了答案:


在ARC下,
self
始终是
不安全的未恢复的
,因此在我的示例中,它将不安全,并且没有任何东西可以阻止它通过我的
doStuff
方法中途释放。哎哟

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


是的,猎户座,你的问题已经被回答了,

这个问题已经被bean回答了@YuriiKolesnykov我不知道这个问题如何回答这个问题。这不是另一个问题的重复。另一个问题集中在保留周期上。不,你不需要做strongSelf。当调用doStuff时,弱对象将被保留,直到doStuff返回。根据答案,当您在doStuff内时,self不会自动保留。您的示例是正确的,因为一旦调用doStuff,welf基本上会被保留,直到doStuff返回。
    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        typeof(self) strongSelf = weakSelf;
        [strongSelf doStuff];
    })