在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?我很高兴看到一些澄清。
答案 0 :(得分:6)
如果[super init]
想要返回nil,则还应该自行调用release
。
答案 1 :(得分:2)
init
方法如果决定中止并返回nil
,则应删除该对象。
然而,这正是if (self)
涵盖的内容。 self = [super init]
有另一个目的:允许init
方法返回除发送消息的对象之外的其他内容。对于一个真实的例子,[NSArray alloc]
返回一个虚拟对象,该对象的各种init…
方法返回真实数组。