gpt4 book ai didi

objective-c - 可以在调用实例方法时释放 Objective-C 对象吗?

转载 作者:太空狗 更新时间:2023-10-30 03:31:41 26 4
gpt4 key购买 nike

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

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

最佳答案

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

我正在研究这个问题,并在向他展示了这个 stackoverflow 问题后被一位同事纠正了。他指出这一点: 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];
}

关于objective-c - 可以在调用实例方法时释放 Objective-C 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13737201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com