我刚刚在阅读如何在init方法中正确地失败,而文档似乎彼此不一致。其中一个建议抛出异常,而其他建议清理并返回nil。这里目前的最佳实践是什么?
发布于 2009-05-25 17:06:29
我认为普遍接受的做法是在失败时返回nil。但您确实希望释放self以避免泄漏:
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}发布于 2009-05-25 18:06:23
在介绍了正确的解决方案(异常和/或[self release]; return nil;)之后,我将介绍不正确的解决方案。
不要直接发送dealloc。这是release的工作(如果您的代码曾经在GC下运行,那么dealloc是不适用的,我只能推测调用它会导致什么问题)。
Double-不要使用super直接发送它。这将跳过您自己的dealloc实现。
发布于 2009-05-25 17:15:51
Cocoa关于异常的哲学是,只有在程序员出错的情况下才应该抛出异常,比如将非法参数传递给方法。如果出现其他错误,该方法应该只返回NO或nil,并希望通过NSError** "out“参数报告详细信息。
这包括-init方法。如果错误情况可以在最终产品中合法地发生,那么该方法应该释放self (以避免泄漏)并返回nil。
https://stackoverflow.com/questions/907311
复制相似问题