有人可以向我解释一下 init 和 alloc 在 Obj-C 中的作用吗?我正在阅读这本 obj-c 书,其中给出了创建对象的示例,但它并没有真正详细介绍它的作用。 alloc返回什么? init 返回什么?
Animal * k = [Animal alloc];
k = [k init];
-
alloc
分配一块内存来保存对象,并返回指针。
MyClass* myObj = [MyClass alloc];
myObj
尚无法使用,因为其内部状态未正确设置。所以,不要写这样的代码。
-
init
设置对象的初始条件并返回它。注意返回了什么 [a init]
可能不同于a
.这解释了 Yannick 编写的代码:
-init{
self=[super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.
}
- 首先,您需要调用超类的
init
,设置超类的实例变量等。这可能会返回不等于原始值的内容self
,所以你需要分配返回的内容self
.
- If
self
为非零,表示超类控制的部分已正确初始化。现在您执行初始化。所有实例变量都设置为nil
(如果它是对象)和0
如果它是整数。您需要执行其他初始设置。
- 返回设置
self
。返回的self
可能与分配的不同!因此,您需要分配结果init
到你的变量。
这表明了一个重要的教训:永远不要将呼叫拆分为alloc
and init
。不要写:
MyClass* myObj = [MyClass alloc];
[myObj init];
because [myObj init]
可能会返回其他东西。不要试图通过编写以下内容来解决这个问题:
MyClass* myObj = [MyClass alloc];
myObj=[myObj init];
因为你最终会忘记写这部分myObj=
在第二行。
总是写:
MyClass* myObj = [[MyClass alloc] init];
我也不建议这样写:
MyClass* myObj = [MyClass new];
因为它没有正确调用初始化方法:某些类不接受普通的init
。例如,NSView
needs initWithFrame:
,不能用new
。所以,不要使用new
either.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)