我想知道[[alloc] init]
是否只是一个约定,或者两个调用的分离是否有更广泛的用途。例如,我想知道人们是否曾在现有对象上调用[init]
(或朋友)来“重新初始化”它。
答案 0 :(得分:6)
约定是永远不会重新初始化对象。您可以在非常有限的基础上在NSObject子类(或定义新根)的类中进行,但是您不应该使用系统框架中任何其他类的子类来执行此操作。
如果要“重用”类的实例,则提供在指定的初始化程序之外重用的方法。即你可以这样做:
- (void) reset;
或者:
- (void) resetWithNewState: (MyState *) aState;
答案 1 :(得分:5)
按照惯例,init系列的唯一用途是它们互相调用时。例如:
-(id) initWithSomething:(int)something {
self = [super init];
// use something
return self;
}
-(id) init {
return [self initWithSomething:3];
}
你可能会传递一个从未调用过init的僵尸对象,但我想不出有这么好的理由。如果你想在不知道类型的情况下创建一个对象,你可以传递一个Class。
-(id) makeAnything:(Class)someClass {
return [[someClass alloc] init];
}
编辑:
alloc
保证所有成员都被初始化为零,并且许多init
方法依赖于此。不止一次致电init
会破坏合同。
答案 2 :(得分:3)
有趣的问题。就个人而言,在我开始搞乱之前我会三思而后行。它似乎只是在寻找新的bug来源,而不是带来任何你无法以更安全的方式获得的新东西。也许我只是不明白在alloc中发生了什么,并且init足以使用这些部分,但我发现“哑”代码通常会让我更开心(KISS)。
答案 3 :(得分:2)
如果内存受到高度约束(如在iPhone应用程序中),您可以“分配”一个(或几个)实例,然后重复使用它们。但是,您需要注意泄漏,因为在init中保留/创建的对象通常在“免费”消息中被释放/释放。