11

考虑以下情况:Objective-C 类的一个实例被一个强引用和一个弱引用引用(在 ARC 下)。在线程 X 上,通过弱引用在实例上调用方法。在线程 Y 上,强引用被破坏,因此不再有对该实例的强引用,它应该被释放。

这种情况是否可能,因为当方法在线程 X 上执行时,对象可能在线程 Y 上被释放?同样,在对象上调用方法是否会“保留”该对象,直到该方法返回?

4

1 回答 1

15

ARC 实际上在调用实例方法之前确实保留了弱引用,并在调用后释放。

我正在研究这个问题,并在向他展示这个 stackoverflow 问题后被一位同事纠正。他指出了这一点:http: //lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

果然,在程序集中,ARC 围绕弱引用的调用保留和释放。

有一次你会想听 CLANG_WARN_OBJC_RECEIVER_WEAK 用于 nil 检查,当 nil 可能导致错误时。

if (self.weakRefToParent) {
    //self.weakRefToParent could be dealloced and set to nil at this line
    NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning
    [self.namesArray addObject:name];  //name is nil, NSInvalidArgumentException
}

这是更安全的方法:

Parent *strongRefToParent = self.weakRefToParent;
if (strongRefToParent) {
    NSString *name = [strongRefToParent name];
    [self.namesArray addObject:name];
}
于 2013-01-07T02:54:23.643 回答