首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当一个实例方法被调用时,Objective-C对象可以被释放吗?

当一个实例方法被调用时,Objective-C对象可以被释放吗?
EN

Stack Overflow用户
提问于 2012-12-06 12:55:45
回答 1查看 1.8K关注 0票数 11

考虑以下情况: Objective-C类的一个实例被一个强引用和一个弱引用引用(在ARC下)。在线程X上,通过弱引用在实例上调用一个方法。在线程Y上,强引用被破坏,因此不再有对实例的强引用,应该释放它。

当方法在线程X上执行时,对象可能会在线程Y上被释放,这种情况可能吗?类似地,在对象上调用方法是否会“保留”该对象,直到该方法返回?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-07 10:54:24

ARC实际上在调用它们的实例方法之前保留了弱引用,并在调用后释放。

我正在研究这个问题,在向一个同事展示了这个堆栈溢出问题后,他纠正了我的问题。他指出:http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

果然,在程序集中,ARC在弱引用的调用周围保留和释放。

有一次你想要监听CLANG_WARN_OBJC_RECEIVER_WEAK是为了进行nil检查,这时nil可能会导致错误。

代码语言:javascript
运行
复制
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
}

这是更安全的方法:

代码语言:javascript
运行
复制
Parent *strongRefToParent = self.weakRefToParent;
if (strongRefToParent) {
    NSString *name = [strongRefToParent name];
    [self.namesArray addObject:name];
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13737201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档