我应该使用自己。释放时

时间:2011-10-01 02:43:44

标签: objective-c memory-management

当我定义变量并且我想知道时,我有一大堆@property (nonatomic, retain)内容正在进行:

在我的dealloc方法中,我应该发布[myGreatVariable release];还是[self.myGreatVariable release];。它们目前以前一种方式完成。这有多重要?从现在开始习惯这样做是不是很好,或者我应该在我的所有课程中重新修改所有课程,因为事情实际上并没有被释放。

3 个答案:

答案 0 :(得分:3)

请勿使用[self.myGreatVariable release]。正如Daniel所说,它将在这种情况下起作用,但它是最“混乱”的版本,并且会在-dealloc之外的任何地方执行错误的事件,因为它可能会留下垃圾参考。属性。

您应该选择其中一个,并将其标准化:

  1. [myGreatVariable release];
  2. self.myGreatVariable = nil;
  3. (选择主要取决于个人偏好。我只使用dealloc中的第一个表单,因为setter有时非常重要并且有副作用,而dealloc的目标是提高效率显然摆脱了所有的资源,不要因意外的状态变化而被绊倒。)

答案 1 :(得分:2)

如果你处于dealloc状态并不重要,尽管前者更有效率。但你有第三个选择做self.myFairlyGoodVariable = nil;,它依赖于setter方法来进行释放(虽然效率低两三个)。

我怀疑你会发现你应该做什么的不同论点。有些人认为你应该使用实例变量(没有self.)进行所有读取访问。其他人会争辩说你应该在任何地方使用属性访问(即self.)。我倾向于落入后一阵营,但我可以接受另一方的争论。

尽管如此,重要的是要保持合理的一致性。如果你和其他人一起工作,那么如果你有一个团队“标准”就可以了。

(我喜欢做的一件事是将dealloc方法放在.m文件的顶部,而在底部通常会结束。这样你就更有可能记得更新添加/更改属性以及关联的dealloc语句时的@synthesize方法。)

答案 2 :(得分:1)

在dealloc中使用“self.variable = nil”的一个问题是,如果重写了“setVariable”,它可以触发其他操作。例如,只要变量值发生变化,某些类就会向委托人发出信号,但是一旦你处于dealloc状态,你可能不希望这样做。使用“[variable release]”会更安全一些。

希望ARC能尽快消除这一切。