1

我读过在和对象的“init”方法中使用 self.ivar = (convenience method) 是不好的,因为这会与继承相混淆。

但是,如果您知道您不会对您的对象进行子类化,那么可以使用 self 关键字赋值吗?

i.e. self.iVar = [Object objectConvenienceMethod];

我问的原因是这个。我用自己的 init 方法创建了一个新对象,并在该方法中执行各种初始分配。由于我不使用 self 关键字,我将它们直接分配给 iVar,因此使用 alloc 方法而不是便捷方法。IE

iVar = [[Object alloc] init];

或者,如果我使用方便的方法,我会保留它。IE

iVar = [[Object convenienceMethod]retain]

但是...当我使用内存泄漏工具运行我的程序时,所有这些分配都被识别为内存泄漏。

如果我可以使用 self 关键字加上一个方便的方法而不是 alloc-init,那么这将避免这个问题。

如果我选择使用 alloc-init 方法,我应该在哪里发布 iVar?只是在dealloc?

谢谢你的帮助 :)

迈克尔

4

3 回答 3

2

不,因为您需要考虑的不仅仅是子类行为——超类实现甚至框架生成的代码行为(例如合成访问器和用于实现 KVO 的黑魔法)也会造成麻烦。它可能会没事,但这仍然是一个很大的不正常的机会。总而言之,最好只是按照苹果的建议直接分配。

在 init 中分配给 ivars 不应报告为正常运行的程序中的泄漏。如果您看到这一点,那么您需要解决一些其他问题。尝试将问题减少到我们可以尝试并询问的最小情况 - 然后我们可以找出问题所在。

于 2010-11-23T18:19:06.727 回答
1

如果你allocretain它们在你的类的init方法中,你应该在相应的dealloc方法中释放它们。

于 2010-11-23T17:16:54.397 回答
0

我在想你的“封闭”类没有被释放,因此它的 dealloc 方法没有被调用,导致你的 iVar 没有被释放。

于 2010-11-23T18:11:49.120 回答