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];
})