当我定义变量并且我想知道时,我有一大堆@property (nonatomic, retain)
内容正在进行:
在我的dealloc
方法中,我应该发布[myGreatVariable release];
还是[self.myGreatVariable release];
。它们目前以前一种方式完成。这有多重要?从现在开始习惯这样做是不是很好,或者我应该在我的所有课程中重新修改所有课程,因为事情实际上并没有被释放。
答案 0 :(得分:3)
请勿使用[self.myGreatVariable release]
。正如Daniel所说,它将在这种情况下起作用,但它是最“混乱”的版本,并且会在-dealloc
之外的任何地方执行错误的事件,因为它可能会留下垃圾参考。属性。
您应该选择其中一个,并将其标准化:
[myGreatVariable release];
self.myGreatVariable = nil;
(选择主要取决于个人偏好。我只使用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能尽快消除这一切。