当init内部出现故障时,我是否应该始终释放self,或者如果我首先初始化实例变量,我是否应该这样做?
换句话说,这种模式有效吗?有没有时间我不应该在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;
}
答案 0 :(得分:17)
如果初始化方法中的某些检查失败,那么您应该释放self
。但请注意,如果[super init]
返回nil
,则将self
发送到self
是没有意义的nil
是[self release]
。这实际上是Apple不赞成的:
您应该只在失败时致电
nil
。如果从超类的初始化程序的调用中得到release
,则不应该调用- (id)init { self = [super init]; if(self) { // do some init stuff if (somethingFailed) { [self release] self = nil; } } return self; }
。
示例:
{{1}}上的Mac开发人员中心文档