1

免责声明,我是Objective C的新手。但我找不到这个解释。我已经看到了两种实现 init 的方法:

- (id)init {

  if ([super init]) {
    return self;
  } else {
    return nill;
  }

}

- (id)init {
    if (self = [super init]) {
      // do your init business here
    } 
    return self;
}

所以假设我有:

myObj = [[MyObject alloc] init];

其中 MyObject 类是 NSObject 的子类。在第二个例子中,init 不返回 NSObject 的初始化版本吗?所以 myObj 会......它怎么知道它是什么?它不会认为它是 NSObject 而不是 MyObject 吗?

4

2 回答 2

3

1)第一个版本是错误的。self应该始终分配super初始化程序返回的值,因为可以在初始化init<...>super返回另一个对象(顺便说一句,这并不罕见)。第二个版本实际上是实现init<...>方法的“官方”方式。

2) '它不会认为它是一个 NSObject 而不是一个 MyObject'。myObj“NSObject”的实例和“MyObject”的实例。这是继承的全部意义。

于 2011-03-12T02:00:42.400 回答
1

我只是想知道,在引擎盖下,它是如何做到的。

这很简单。您将编写的所有类中有 99.9%将以某种方式继承NSObject。在初始化程序中,您应该调用super的指定初始化程序并将其分配给self. 最终,[super init]将调用-[NSObject init]. 根据文档,这是这样实现的:

- (id)init {
    return self;
}

所以从技术上讲,如果你直接从 继承NSObject,你可能不做 的分配是安全的self = [super init];,因为你知道(并且你保证)这相当于:self = self;,这是毫无意义的。无论如何,为了一致性起见,您应该保留它。

然而,一旦你开始在继承链中走得更远,特别是当你从不透明的类(即你没有.m 文件的类)继承时,事情就开始变得阴暗了。您可能会遇到一个类,其指定的初始化程序如下所示:

- (id) initWithFoo:(id)aFoo {
  if ([aFoo isSuperFast]) {
    [self release];
    return [[SuperFastFooWrapper alloc] initWithFoo:aFoo];
  }
  self = [super init];
  if (self) {
    _foo = [aFoo retain];
  }
}

这并不常见,但确实会发生。在这种情况下,我们正在销毁self( [self release], 以平衡alloc紧接在此之前的调用) 并返回一个不同的对象。

于 2011-03-12T05:42:42.070 回答