2010-01-01 61 views
7

当您在一个对象上多次调用-init时会发生什么情况,是否存在一些隐藏的副作用? 你能否假设没有额外的内存分配? 会有什么违背这样的想法?在Objective-C中多次调用-init

+0

不,你不能假定一个对象的初始值设定项没有分配内存。你为什么想要摆在首位? – 2010-01-01 20:26:48

+1

我使用IB创建一个对象并将其与相应的控制器插座相连接。我观察到这个对象被初始化了,所以假定+ alloc和-init必须被调用。所以问题出现了,如果我可以用不同的值再次初始化对象。 – CipherCom 2010-01-01 22:47:40

+2

如果你已经在Interface Builder中实例化了一个对象,你需要重写'-initWithCoder:',因为它会被调用而不是'-init',因为对象被存档在nib中,并且必须被解除存档才能被应用程序使用。或者,只需实现'-awakeFromNib'并在那个地方改变你想要的任何设置。 – 2010-01-02 01:13:02

回答

31

调用-init多次未定义,不受支持,并且导致错误,崩溃和其他意外行为。

很多类 - NSStringNSArray,并NSDictionary,例如 - 实际上没有分配任何+alloc方法被调用。直到调用各种-init*方法之一,该对象才有足够的上下文来找出最有效的方法来做你所要求的任何事情。

3

我在Bill的答案中添加的一件事是,在编写自己的-init方法时,需要防御性编码,并且不要认为它们只会被调用一次。

+2

如何优雅地检查对象没有调用init方法? – jbat100 2011-10-18 22:40:16