我应该总是为失败的初始化方法释放自我吗?
Posted
技术标签:
【中文标题】我应该总是为失败的初始化方法释放自我吗?【英文标题】:Should I always release self for failed init methods? 【发布时间】:2011-01-28 21:20:01 【问题描述】:当 init 内部出现故障时我应该总是释放 self,还是应该只在我首先初始化实例变量时才这样做?
换句话说,这种模式有效吗?是否有一段时间我不应该在 init 方法中释放 self,或者我应该假设如果控制流进入 init,self 的保留计数至少为 1?
- (id)init
if ((self = [super init]) == nil)
[self release];
return nil;
//do some init stuff
if (somethingFailed)
[self release];
return nil;
return self;
【问题讨论】:
【参考方案1】:如果您在初始化方法中需要的某些检查失败,那么是的,您应该释放self
。但是请注意,如果[super init]
返回nil
,则将释放发送到self
是没有意义的,因为self
是nil
。这实际上是苹果不赞成的:
您应该只在发生故障时调用
[self release]
。如果你从调用超类的初始化程序得到nil
,你不应该也调用release
。
例子:
- (id)init
self = [super init];
if(self)
// do some init stuff
if (somethingFailed)
[self release]
self = nil;
return self;
另请参阅Handling Initialization Failure 上的 Mac 开发中心文档
【讨论】:
啊,现在你指出来似乎很明显。我有点被甩了,因为我在一个没有调用 alloc/copy/new 等的对象上调用 release。 是的,基本原则是,谁在初始化中首先遇到错误,就应该释放调用init的分配空间,然后应该返回nil。由于其他人都为零,他们无法释放内存,因此为什么你应该在 self 上调用 release 以避免内存泄漏。 奇怪的是文档会明确告诉你不要向 nil 发送消息,因为什么都不应该发生。 @tedge 我也是这么想的,因为向 nil 发送 release 被明确定义为无操作。以上是关于我应该总是为失败的初始化方法释放自我吗?的主要内容,如果未能解决你的问题,请参考以下文章