在对象的init方法中使用self关键字分配ivars

时间:2010-11-23 16:51:21

标签: iphone objective-c initialization instance-variables self

我已经读过,使用self.ivar =(便捷方法)和对象的'init'方法是不好的,因为这与继承混淆。

但是,如果你知道你不打算继承你的对象,那么使用self关键字赋值是否可以?

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

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

iVar = [[Object alloc] init];

或者,如果我使用便利方法,我保留它。即。

iVar = [[Object convenienceMethod]retain]

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

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

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

感谢您的帮助:)

迈克尔

3 个答案:

答案 0 :(得分:2)

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

在init中分配给ivars不应该在正常运行的程序中报告为泄漏。如果你看到了,还有一些其他问题你需要解决。尝试将问题减少到我们可以试用的最小情况并询问 - 然后我们可以判断出什么是错的。

答案 1 :(得分:1)

如果您在班级的alloc方法中retaininit,则应使用相应的dealloc方法发布它们。

答案 2 :(得分:0)

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