可以在调用实例方法时释放 Objective-C 对象吗?
Posted
技术标签:
【中文标题】可以在调用实例方法时释放 Objective-C 对象吗?【英文标题】:Can an Objective-C object be deallocated while an instance method is being invoked on it? 【发布时间】:2012-12-06 04:55:45 【问题描述】:考虑以下情况:Objective-C 类的实例被一个强引用和一个弱引用引用(在 ARC 下)。在线程 X 上,通过弱引用在实例上调用方法。在线程 Y 上,强引用被破坏,因此不再有对该实例的强引用,应该将其释放。
这种情况是否可能,因为当方法在线程 X 上执行时,对象可能在线程 Y 上被释放?同样,在对象上调用方法是否会“保留”该对象直到方法返回?
【问题讨论】:
【参考方案1】:ARC 实际上会在调用实例方法之前保留弱引用,并在调用后释放。
我正在研究这个问题,并在向他展示了这个 *** 问题后得到了一位同事的纠正。他指出了这一点: 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];
【讨论】:
更好的答案(如“准确并基于编译器作者的明确回应”)。谢谢! 如果这是真的,那为什么会出现这样的崩溃呢? ***.com/questions/9068820/… 这个问题是关于弱引用的调用,似乎其他问题正在发生其他事情。以上是关于可以在调用实例方法时释放 Objective-C 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章