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

时间:2010-11-03 01:57:25

标签: objective-c memory-leaks

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

MyClass* object = [[MyClass alloc] init];

MyClass init 方法的标准实现如下所示:

-(id) init
{
    self = [super init];
    if(self) { /* initialize */ }
    return self;
}

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

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

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

在调用 alloc 之后,在调用init:

之前检查结果
MyClass* object = [MyClass alloc];
if(object == nil) { /*handle the error */ }
else { object = [object init]; }

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

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

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

2 个答案:

答案 0 :(得分:6)

如果[super init]想要返回nil,则还应该自行调用release

答案 1 :(得分:2)

init方法如果决定中止并返回nil,则应删除该对象。

然而,这正是if (self)涵盖的内容。 self = [super init]有另一个目的:允许init方法返回除发送消息的对象之外的其他内容。对于一个真实的例子,[NSArray alloc]返回一个虚拟对象,该对象的各种init…方法返回真实数组。