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

ite*_*ter 7 oop objective-c

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

bbu*_*bum 6

惯例是永远不要重新初始化对象.您可以在非常有限的基础上在NSObject子类(或定义新根)的类中进行,但是您不应该使用系统框架中任何其他类的子类来执行此操作.

如果要"重用"类的实例,则提供在指定的初始化程序之外重用的方法.即你能做到:

- (void) reset;
Run Code Online (Sandbox Code Playgroud)

要么:

- (void) resetWithNewState: (MyState *) aState;
Run Code Online (Sandbox Code Playgroud)


dra*_*ard 5

按照惯例,init系列的唯一用途是它们互相调用时.例如:

-(id) initWithSomething:(int)something {
  self = [super init];
  // use something
  return self;
}

-(id) init {
  return [self initWithSomething:3];
}
Run Code Online (Sandbox Code Playgroud)

你可能会传递一个从未被调用过init的僵尸对象,但我想不出这样做的好理由.如果要在不知道类型的情况下创建对象,可以传递一个类.

-(id) makeAnything:(Class)someClass {
  return [[someClass alloc] init];
}
Run Code Online (Sandbox Code Playgroud)

编辑:

alloc保证所有成员都初始化为零,并且许多init方法依赖于此.init不止一次打电话打破了这份合同.

  • 虽然这个答案是正确的,但它没有回答所提出的问题:特别是,它是否有意义.公约可能规定只从其他初始方法中调用它们; 但正如我在回答中指出的那样,有(不常见的)用例,例如表视图单元实例重用操作. (2认同)