可以在调用实例方法时取消分配Objective-C对象吗?

And*_*ger 8 multithreading objective-c

请考虑以下内容:Objective-C类的实例由一个强引用和一个弱引用(在ARC下)引用.在线程X上,通过弱引用在实例上调用方法.在线程Y上,强引用被破坏,以便不再有对该实例的强引用,并且应该取消分配它.

这种情况是否可能,因为当方法在线程X上执行时,对象可能在线程Y上被释放?类似地,在方法返回之前,是否调用对象上的方法"保留"该对象?

Jam*_*ell 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
}
Run Code Online (Sandbox Code Playgroud)

这是更安全的方式:

Parent *strongRefToParent = self.weakRefToParent;
if (strongRefToParent) {
    NSString *name = [strongRefToParent name];
    [self.namesArray addObject:name];
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的答案(如"准确并基于编译器作者的明确答复").谢谢! (2认同)