似乎在一本书的代码示例中,init
总是定义 ,以便仔细检查是否self
能够存在。
-(id) init {
self = [super init];
if (self) {
// initialize
}
return self;
}
但是,在返回时,根本没有任何代码检查对象是否能够存在。但是该不该检查,又该如何处理呢?如果对象不存在,是不是说明系统内存严重不足,甚至弹出错误信息也不可能了?
似乎在一本书的代码示例中,init
总是定义 ,以便仔细检查是否self
能够存在。
-(id) init {
self = [super init];
if (self) {
// initialize
}
return self;
}
但是,在返回时,根本没有任何代码检查对象是否能够存在。但是该不该检查,又该如何处理呢?如果对象不存在,是不是说明系统内存严重不足,甚至弹出错误信息也不可能了?
但是,在返回时,根本没有任何代码检查对象是否能够存在。但是该不该检查,又该如何处理呢?
通常,当nil
返回时,子类会忽略错误处理。返回时,错误处理通常留给调用者nil
。如惯用语所示-init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
同样,如果基址在 中重新分配self
,init
则self
重新分配 ( self = [super init];
)。效果很好。
如果您未能分配给' 的初始化程序self
的结果,super
或者您未能检查如果没有遇到另一个区域)。nil
EXC_BAD_ACCESS
EXC_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
说“在这种情况下不能做”,或者是否存在简单的参数错误。
这是否意味着系统内存严重不足
不会。分配内存失败通常会导致+alloc 失败,而不是-init。
实际上,没有参数的 init 方法失败的情况很少见。通常,如果您传递了无效的参数,init 方法可以返回 nil,例如 NSString 的 -initWithContentsOfFile: 如果无法加载应该初始化的文件路径的内容,则可以返回 nil。
如果您意识到初始化失败的可能性很大,则可能需要检查它,否则,您应该继续使用该对象。