非ARC:我应该在[自我发布]之前调用[super init]吗?

时间:2014-02-04 09:44:39

标签: objective-c release init self

我有一个自定义的非ARC初始化,我想知道在释放self之前是否应该调用[super init]

解决方案A,未在[super init]之前调用[self release]

- (instancetype)initWithInteger:(NSInteger)anInteger
{
    if (anInteger == 0)
    {
        [self release];
        return nil;
    }
    self = [super init];
    if (!self)
        return nil;

    // Initialization code
    self.i = anInteger;

    return self;
}

解决方案B,在[super init]之前调用[self release]

- (instancetype)initWithInteger:(NSInteger)anInteger
{
    self = [super init];
    if (!self)
        return nil;
    if (anInteger == 0)
    {
        [self release];
        return nil;
    }

    // Initialization code
    self.i = anInteger;

    return self;
}

1 个答案:

答案 0 :(得分:5)

我会选择第二种模式。这样做的原因是super的dealloc可能依赖于super的init中的某些东西来完成正常工作。

这是一个(非常)人为的例子,这是你正在子类化的类中的init和dealloc方法。

@implementation ASuperClass
{
    char* foo;
}

-(id) init 
{
    self = [super init];
    if (self != nil)
    {
        foo = strdup("blah blah blah");
    }
    return self;
}

-(void) dealloc
{
    if (foo[1] == 'l')
    {
        NSLog(@"Second character was l");
    }
    free(foo);
}

在上面,如果这是你继承的类,你的第一个模式将在空指针解除引用上抛出EXC_BAD_ACCESS。