可以在调用实例方法时释放 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 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 自动释放内存管理

Objective-c:从方法返回自动释放的对象

属性存取直接访问实例变量

iOSMRC

Objective-C多线程,当一个对象在其方法被执行时被释放会发生啥? (以及如何预防?)

Objective-C