Objective-C中的标准对象初始化是否导致内存泄漏?

Dan*_*Dan 6 memory-leaks objective-c

在Objective-C中创建对象的标准方法如下所示:

MyClass* object = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

MyClassinit方法的标准实现看起来像这样:

-(id) init
{
    self = [super init];
    if(self) { /* initialize */ }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

除了一些语法更改,并且不包括工厂方法,这似乎是编写init方法并使用它的推荐方法.

据我所知,self = [super init]的目的; 是处理[super init]失败的情况.但如果它确实失败了,并且返回nil,那么内存是否会泄漏?原因是MyClass的init将返回nil,对象将为nil,将不再有引用[MyClass alloc]分配的对象的指针,因此无法释放它.

这些是我能想到的两种解决方案,但我没有在常规练习中看到过这两种解决方案.

在调用alloc之后,在调用init之前检查结果:

MyClass* object = [MyClass alloc];
if(object == nil) { /*handle the error */ }
else { object = [object init]; }
Run Code Online (Sandbox Code Playgroud)

或者,如果[super init]失败,请释放内存.像这样的东西:

-(id) init
{
    id temp = [super init];
    if(!temp) { [self release]; }
    self = temp;
    if(self) { /* initialize */ }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

这个推理我错了吗?可以说[super init]不太可能失败,但是为什么要将结果分配给自己并检查为零?我很高兴看到一些澄清.

Lou*_*nco 6

如果[super init]想要返回nil,它也应该调用releaseself.