gpt4 book ai didi

objective-c - 释放或设置为零保留成员

转载 作者:行者123 更新时间:2023-12-04 02:32:41 26 4
gpt4 key购买 nike

是将我保留的成员变量设置为 nil 还是在清理时释放它们更好?将保留的 var 设置为 nil 似乎是一种更安全的释放对象的方法,而不会冒对其进行双重释放调用的风险。

更新:让我详细说明一下,我指的是已设置为具有保留属性的成员变量,即:

@property (nonatomic, retain) SomeClass* mInstanceVar;

最佳答案

最好先释放实例变量,然后在 -dealloc 方法中将它们设置为 nil。我个人喜欢这样做:

[myVar release], myVar = nil;

如果将实例变量设置为 nil,则不会释放它们,并且会导致内存泄漏。尽管在释放后将它们设置为 nil 将确保您不会导致泄漏,并且如果由于某种原因您稍后尝试访问这些实例变量,您将不会获得垃圾内存。


如果你有一个这样设置的实例变量,

@property (retain) NSObject *myVar;

那么在释放期间调用 self.myVar = nil; 并不是一个好主意。如果你有对象在你的实例变量上注册了 KVO 通知,调用 self.myVar = nil 将发送这些通知,并且其他对象也会收到通知,这是不好的,因为他们会期望你仍然处于有效状态——如果你处于重新分配过程中,你就不是。

即使它们没有注册 KVO 通知,这样做仍然不是一个好主意,因为当对象的状态不一致时,您永远不应该调用可能依赖对象状态的方法(某些变量可能/将不存在) ,你应该自己处理这个过程。 [myVar release], myVar = nil; 就足够了。

如果您想了解更多信息,请阅读 Dave DeLong 对 this 的回答问题。


对于初始化,调用属性 setter 和 getter 也是不好的(原因同上)。在 -init 调用中,您可以这样设置上述变量:

myVar = nil; // If you want to set it up as nil.
OR
myVar = [[NSObject alloc] init]; // Or set it up as an actual object.

避免 self.myVar = nilself.myVar = [[NSObject alloc] init 在你的类处于不确定状态的情况下(这些调用在-viewDidLoad-awakeFromNib,因为到那时,您的类已经完全初始化,您可以依赖实例变量处于完整状态)。

关于objective-c - 释放或设置为零保留成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358134/

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