谁能给我解释一下 init 和 alloc 在 Obj-C 中的作用。我正在阅读这本 obj-c 书,它给出了一个创建对象的示例,但它并没有真正详细说明它的作用。 alloc 返回什么? init 返回什么?
Animal * k = [Animal alloc];
k = [k init];
最佳答案
alloc
分配一 block 内存来存放对象,并返回指针。MyClass* myObj = [MyClass alloc];
myObj
还不能使用,因为它的内部状态没有正确设置。所以,不要写这样的代码。init
设置对象的初始条件并返回它。请注意,返回的内容[a init]
可能与a
不同。 这解释了 Yannick 编写的代码:-init{ self=[super init]; // 1. if(self){ // 2. .... } return self; // 3. }
- 首先,您需要调用父类(super class)的
init
,设置父类(super class)的实例变量等。这可能会返回一些不等于原始self
的东西,所以您需要将返回的内容分配给self
。 - 如果
self
不为nil,则表示父类(super class)控制的部分已正确初始化。现在执行初始化。所有实例变量都设置为nil
(如果它是对象)和0
(如果它是整数)。您需要执行额外的初始设置。 - 返回设置
self
。返回的self
可能与分配的不同!因此,您需要将init
的结果分配给您的变量。
- 首先,您需要调用父类(super class)的
这暗示了一个重要的教训:永远不要将对 alloc
和 init
的调用分开。不要写:
MyClass* myObj = [MyClass alloc];
[myObj init];
因为 [myObj init]
可能会返回其他内容。不要试图通过写来解决这个问题:
MyClass* myObj = [MyClass alloc];
myObj=[myObj init];
因为你最终会忘记在第二行写 myObj=
部分。
总是写:
MyClass* myObj = [[MyClass alloc] init];
我也不推荐这样写:
MyClass* myObj = [MyClass new];
因为它没有正确调用初始化方法:一些类不接受普通的init
。比如NSView
需要initWithFrame:
,不能用new
调用。所以,也不要使用 new
。
关于objective-c - alloc 和 init 它们实际上做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848990/