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

Vic*_*nin 31 iphone objective-c

在这种情况下,如果我们在init方法中返回nil,那么使用retain count会发生什么以及谁将要释放这个对象?

正如我在调用alloc(它将在init之前发生)时所做的那样,保留计数将变为1.现在,调用init并且由于某种原因让它无法初始化对象,因此它返回nil.

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

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

bbu*_*bum 46

请参阅文档中的分配和初始化对象.

具体来说,如果初始化程序中有错误,那么您release self返回nil:

- init
{
    self = [super init];
    if (self) {
         if (... failed to initialize something in self ...) {
             [self release];
             return nil;
         }
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

现在,考虑一下当你打电话给[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;
 }
Run Code Online (Sandbox Code Playgroud)

因为init预期会返回一些东西retained(通过暗示被束缚+alloc),那么[self retain]虽然它看起来很傻,但实际上是正确的.在self = [self retain]的情况下,仅仅是作为额外的防守MyClass覆盖retain做一些奇怪的.

  • 在ARC中怎么样,它知道"[自我释放]",还是应该将自己设置为零? (4认同)
  • 对.谢谢......所以真的需要编译器和运行时集成. (2认同)