在Objective C代码中返回init中的nil

时间:2010-12-02 15:58:14

标签: iphone objective-c

在这种情况下,如果我们在init方法中返回nil,那么保留计数发生了什么,谁将发布这个对象?

当我们调用alloc(它将在init之前发生)时,保留计数将变为1.现在,init被调用并且由于某种原因让它说不能初始化对象,所以它返回nil

现在看起来我们的对象的保留计数等于1,没有人引用它来调用release。

我们应该在init中为这种情况调用[self autorelease]还是做其他事情?

2 个答案:

答案 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返回表明实例已经消失。没有泄漏,每个人都很高兴。

这也是一种有效模式(假设selfMyClass的实例):

- 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方法必须处理已经

的对象