我刚刚读到了如何在init方法中正确失败,并且文档似乎彼此不同意.一个建议抛出异常,而其他人建议清理并返回零.目前最好的做法是什么?
我相信普遍接受的做法是在失败时返回零.但你确实希望释放自我以避免泄漏:
-(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.