如果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 getnil
back 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文档