如何在自定义init失败时清理内存

时间:2011-07-27 19:19:47

标签: objective-c memory-management initialization

当我的自定义初始化程序失败时,我应该返回nil。清理我在初始化程序中分配的任何内存的惯例是什么,我期望在dealloc中清理它?

这是一个人为的例子:

- (id)init
{
    if ((self = [super init])) {
        instanceVar1 = [[NSString alloc] initWithString:@"blah"];
        if (bad_thing_oh_noes) {
            return nil;
        }
    }
    return self;
}

- (void)dealloc
{
    [instanceVar1 release];

    [super dealloc];
}

在我进行分配之前无法有效地检查每个错误条件的更现实的情况是反序列化包含数组等的复杂对象。

无论如何,在返回nil之前,我是否要清理已分配的内存,在返回nil之前是否向自己发送dealloc消息,或者是否神奇地管理了所有这些内容?

1 个答案:

答案 0 :(得分:2)

如果在初始化程序期间发生错误,您应致电release上的self并返回nil

if (bad_thing_oh_noes) {
    [self release];
    return nil;
}

此外,您必须确保在部分初始化的对象上调用dealloc是安全的。

您应该仅在失败时致电release。如果从超类的初始值设定项中获得nil,则不应调用release

通常,在初始化失败时不应抛出异常。

来自Handling Initialization Failure的示例:

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr {

    self = [super init];
    if (self) {

        NSData *data = [[NSData alloc] initWithContentsOfURL:aURL
                                       options:NSUncachedRead error:errorPtr];

        if (data == nil) {
            // In this case the error object is created in the NSData initializer
            [self release];
            return nil;
        }
        // implementation continues...