我有一个自定义的非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;
}
答案 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。