我刚刚在阅读有关如何正确地在init方法中失败的内容,文档中似乎存在不同的意见。其中一个建议抛出异常,而其他人则建议清理并返回nil。这里当前的最佳实践是什么?
我刚刚在阅读有关如何正确地在init方法中失败的内容,文档中似乎存在不同的意见。其中一个建议抛出异常,而其他人则建议清理并返回nil。这里当前的最佳实践是什么?
我认为普遍接受的做法是在失败时返回nil。但你确实想要释放self以避免内存泄漏:
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
[self release]; return nil;
)已经涵盖,接下来我将介绍不正确的解决方案。dealloc
。那是release
的工作。(如果您的代码曾在GC下运行,则dealloc
无效,并且我只能推测调用它会导致什么问题。)super
直接发送它。这将跳过您自己的dealloc
实现。Cocoa的异常理念是,只有在程序员错误的情况下才应该抛出异常,比如向方法传递非法参数。如果其他情况出现问题,该方法应该返回NO或nil,并通过NSError**“out”参数报告详细信息。
这包括-init方法。如果错误情况是完成产品中可能合法发生的事情,那么该方法应该释放self(以避免泄漏)并返回nil。
我一直使用的方法是清理并返回nil。你在问题标题中提到的三种方法可能会在调用层次结构更高的位置导致分段错误,而返回nil则不会。我相信Apple文档本身也说在失败时返回nil。你在哪里发现了差异?