请考虑以下内容:Objective-C类的实例由一个强引用和一个弱引用(在ARC下)引用。在线程X上,通过弱引用在实例上调用方法。在线程Y上,强引用被破坏,因此没有对该实例的更强引用,并且应该释放它。
这种情况是否可能,因为当方法在线程X上执行时,对象可能在线程Y上被释放?类似地,调用对象上的方法'保留'该对象,直到该方法返回?
答案 0 :(得分:13)
ARC实际上会在调用实例方法之前保留弱引用,并在调用之后释放。
我正在研究这个问题,并在向他展示了这个stackoverflow问题之后被一位同事纠正了。他指出这个: http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html
果然,在程序集中,ARC保留并释放弱引用的调用。
有一次你想听CLANG_WARN_OBJC_RECEIVER_WEAK用于零检查,当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];
}