在这种情况下,如果我们在init方法中返回nil,那么保留计数发生了什么,谁将发布这个对象?
当我们调用alloc(它将在init之前发生)时,保留计数将变为1.现在,init被调用并且由于某种原因让它说不能初始化对象,所以它返回nil
现在看起来我们的对象的保留计数等于1,没有人引用它来调用release。
我们应该在init中为这种情况调用[self autorelease]还是做其他事情?
答案 0 :(得分:46)
请参阅文档中的Allocating and Initializing Objects。
具体而言,如果您的初始值设定项出错,那么您release
self
并返回nil
:
- init
{
self = [super init];
if (self) {
if (... failed to initialize something in self ...) {
[self release];
return nil;
}
}
return self;
}
现在,请考虑当您致电[super init]
并返回nil
时会发生什么。上面的模式已经被使用,self
已被释放,nil
返回表明实例已经消失。没有泄漏,每个人都很高兴。
这也是一种有效模式(假设self
是MyClass
的实例):
- init
{
self = [super init];
if (self) {
... normal initialization here ...
} else {
self = [MyClass genericInstanceWhenInitializationGoesBad];
self = [self retain];
}
return self;
}
由于init
预计返回的内容为retained
(暗示是从+alloc
链接),那么[self retain]
虽然看起来很傻,但实际上是正确。如果self = [self retain]
覆盖MyClass
做一些奇怪的事情,retain
只是额外的防御。
答案 1 :(得分:-5)
通常,您会致电
self = [super init];
if (self == nil) {
return nil;
}
// do some init job here
return self;
自动释放自己不是你的工作,因为当你拥有它时,它已经是零,所以即使你打电话给[self autorelease];
,它什么都不做。
我认为NSObject init方法必须处理已经
的对象