Iphone 在目标C代码的init中返回nil
在这种情况下,如果我们在init方法中返回nil,那么retaincount会发生什么情况,谁会释放这个对象 当我一调用alloc(这将发生在init之前)就理解了,retain计数将变为1。现在,init被调用,并且由于某种原因它无法初始化对象,因此它返回nil 看起来现在我们有了retaincount等于1的对象,没有人引用它来调用releaseIphone 在目标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中调用[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;
}