在Objective-C中多次调用-init

在Objective-C中多次调用-init,objective-c,cocoa,Objective C,Cocoa,当您对一个对象多次调用-init时会发生什么情况,是否存在一些隐藏的副作用? 你能假定没有分配额外的内存吗? 有什么会违背这种想法吗?多次调用-init是未定义的,不受支持的,会导致错误、崩溃和其他意外行为 例如,许多类--NSString、NSArray和NSDictionary,在调用+alloc方法时实际上不分配任何内容。直到调用了各种-init*方法中的一种,对象才有足够的上下文来找出执行任何请求的最有效方法。我要补充比尔的答案的一点是,在编写自己的-init方法时,要防御性地编写代码,

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

多次调用
-init
是未定义的,不受支持的,会导致错误、崩溃和其他意外行为


例如,许多类--
NSString
NSArray
NSDictionary
,在调用
+alloc
方法时实际上不分配任何内容。直到调用了各种
-init*
方法中的一种,对象才有足够的上下文来找出执行任何请求的最有效方法。

我要补充比尔的答案的一点是,在编写自己的
-init
方法时,要防御性地编写代码,不要假设它们只会被调用一次

不,不能假设对象的初始值设定项没有分配内存。首先,为什么要这样做?我使用IB创建了一个对象,并将其与相应的控制器插座链接。我注意到这个对象已经初始化,所以假设必须调用+alloc和-init。所以问题来了,如果我可以用不同的值再次初始化对象。如果你在Interface Builder中实例化了一个对象,你需要重写
-initWithCoder:
,因为它将被调用,而不是
-init
,因为对象在nib中存档,并且必须未存档才能供应用程序使用。或者,只需实现
-awakeFromNib
,然后在该点上更改您想要的任何设置。如何优雅地检查对象上是否没有调用init方法?