在[[alloc] init]之外调用[init]是否有意义?

时间:2010-05-02 06:37:22

标签: objective-c oop

我想知道[[alloc] init]是否只是一个约定,或者两个调用的分离是否有更广泛的用途。例如,我想知道人们是否曾在现有对象上调用[init](或朋友)来“重新初始化”它。

4 个答案:

答案 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中保留/创建的对象通常在“免费”消息中被释放/释放。