Iphone 在目标C代码的init中返回nil

Iphone 在目标C代码的init中返回nil,iphone,objective-c,Iphone,Objective C,在这种情况下,如果我们在init方法中返回nil,那么retaincount会发生什么情况,谁会释放这个对象 当我一调用alloc(这将发生在init之前)就理解了,retain计数将变为1。现在,init被调用,并且由于某种原因它无法初始化对象,因此它返回nil 看起来现在我们有了retaincount等于1的对象,没有人引用它来调用release 在这种情况下,我们应该在init中调用[self autorelease]还是执行其他操作?通常,您会调用 self = [super init]

在这种情况下,如果我们在init方法中返回nil,那么retaincount会发生什么情况,谁会释放这个对象

当我一调用alloc(这将发生在init之前)就理解了,retain计数将变为1。现在,init被调用,并且由于某种原因它无法初始化对象,因此它返回nil

看起来现在我们有了retaincount等于1的对象,没有人引用它来调用release


在这种情况下,我们应该在init中调用[self autorelease]还是执行其他操作?

通常,您会调用

self = [super init];
if (self == nil) {

   return nil;
}
// do some init job here
return self;
自动释放自我不是你的工作,因为当你拥有它时,它已经为零,所以即使你调用
[self autorelease],它什么也不做

我认为NSObject init方法必须处理已经存在的对象,请参见文档中的

具体来说,如果初始值设定项中有错误,则
释放
self
并返回
nil

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

现在,考虑在调用<代码> [Super init ] < /C>时发生的情况,并返回<代码> nIL/COD>。上面的模式已经被采用,以前的

self
已经被释放,返回的
nil
表示实例已经消失。没有漏洞,每个人都很高兴

这也是一个有效的模式(假设
self
MyClass
的一个实例):


由于
init
预计将返回
保留的内容
(意味着从
+alloc
链接),因此
[self-retain]
虽然看起来很傻,但实际上是正确的。
self=[self-retain]
只是为了防止
MyClass
覆盖
retain
而做一些奇怪的事情。

可能重复谢谢你。知道了。我在文档中不知怎么漏掉了,我需要在返回nil之前释放self。请在页面的一半尝试这个链接:“处理初始化失败”是的。谢谢所以真的需要编译器和运行时集成。在ARC中,它知道如何
[self release]
,或者我应该将self设置为nil吗?链接不再存在,我能找到的最接近的是,得到了更好的东西吗?如果(self){//在这里做一些初始化工作}返回self
,为什么不
- init
{
    self = [super init];
    if (self) {
        ... normal initialization here ...
    } else {
        self = [MyClass genericInstanceWhenInitializationGoesBad];
        self = [self retain];
    }
    return self;
 }