考虑以下情况:Objective-C 类的一个实例被一个强引用和一个弱引用引用(在 ARC 下)。在线程 X 上,通过弱引用在实例上调用方法。在线程 Y 上,强引用被破坏,因此不再有对该实例的强引用,它应该被释放。
这种情况是否可能,因为当方法在线程 X 上执行时,对象可能在线程 Y 上被释放?同样,在对象上调用方法是否会“保留”该对象,直到该方法返回?
考虑以下情况:Objective-C 类的一个实例被一个强引用和一个弱引用引用(在 ARC 下)。在线程 X 上,通过弱引用在实例上调用方法。在线程 Y 上,强引用被破坏,因此不再有对该实例的强引用,它应该被释放。
这种情况是否可能,因为当方法在线程 X 上执行时,对象可能在线程 Y 上被释放?同样,在对象上调用方法是否会“保留”该对象,直到该方法返回?
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];
}