5

似乎在一本书的代码示例中,init总是定义 ,以便仔细检查是否self能够存在。

-(id) init {

    self = [super init];
    if (self) {
        // initialize
    }
    return self;
}

但是,在返回时,根本没有任何代码检查对象是否能够存在。但是该不该检查,又该如何处理呢?如果对象不存在,是不是说明系统内存严重不足,甚至弹出错误信息也不可能了?

4

2 回答 2

4

但是,在返回时,根本没有任何代码检查对象是否能够存在。但是该不该检查,又该如何处理呢?

通常,当nil返回时,子类会忽略错误处理。返回时,错误处理通常留给调用者nil。如惯用语所示-init

- (id)init {
  self = [super init];
  if (self) {
    // initialize
  }
  return self;
}

同样,如果基址在 中重新分配selfinitself重新分配 ( self = [super init];)。效果很好。

如果您未能分配给' 的初始化程序self的结果,super或者您未能检查如果没有遇到另一个区域)。nilEXC_BAD_ACCESSEXC_BAD_ACCESS

更详细的两个案例:

分配自我失败

- (id)init {
  [super init];
  if (self) {
    // self was not reassigned. if super returned an object other
    // than self, then our ivar would be freed, reused, or sitting
    // in an autorelease pool, and the returned instance's ivar
    // would not be assigned -- we wouldn't know the address.
    ivar = 1;
  }
  return self;
}

无法检查 nil

- (id)init {
  self = [super init];
  // super returned nil. ivar is an invalid region:
  ivar = 1;
  return self;
}

是的,我已经看到了这两个。


如果对象不存在,是不是说明系统内存严重不足,甚至弹出错误信息也不可能了?

一点也不。许多初始化器返回nil说“在这种情况下不能做”,或者是否存在简单的参数错误。

于 2012-04-27T23:04:28.000 回答
3

这是否意味着系统内存严重不足

不会。分配内存失败通常会导致+alloc 失败,而不是-init。

实际上,没有参数的 init 方法失败的情况很少见。通常,如果您传递了无效的参数,init 方法可以返回 nil,例如 NSString 的 -initWithContentsOfFile: 如果无法加载应该初始化的文件路径的内容,则可以返回 nil。

如果您意识到初始化失败的可能性很大,则可能需要检查它,否则,您应该继续使用该对象。

于 2012-04-27T22:37:48.210 回答