如果init中出现故障,我应该总是释放自己,还是只有在初始化了实例变量的时候才应该这么做?
换句话说,这种模式是否有效?有没有时间,我不应该在init方法中释放self,或者我应该假设如果控制流进入init,self至少有一个保留计数为1?
- (id)init
{
if ((self = [super init]) == nil)
{
[self release];
return nil;
}
//do some init stuff
if (somethingFailed)
{
[self release];
return nil;
}
return self;
}
解决方法
如果在初始化方法中需要检查失败,那么是的,你应该释放自己.但是请注意,如果[super init]返回nil,那么将自己发送给self是没有意义的,因为self为nil.这实际上是由苹果皱眉:
You should only call
[self release]at the point of failure. If you getnilback from an invocation of the superclass’s initializer,you should not also callrelease.
例:
- (id)init
{
self = [super init];
if(self) {
// do some init stuff
if (somethingFailed)
{
[self release]
self = nil;
}
}
return self;
}
另请参阅Handling Initialization Failure上的Mac Dev Center文档