有人可以向我解释一下init和alloc在Obj-C中做了什么。我正在阅读这本obj-c书,它提供了一个创建对象的例子,但它并没有详细说明它的作用。 alloc返回什么?什么是init返回?
Animal * k = [Animal alloc];
k = [k init];
答案 0 :(得分:40)
alloc
分配一块内存来保存对象,并返回指针。
MyClass* myObj = [MyClass alloc];
myObj
尚未使用,因为其内部状态未正确设置。所以,不要写这样的代码。
init
设置对象的初始条件并返回它。请注意 [a init]
返回的内容可能与a
不同。这解释了Yannick写的代码:
-init{
self=[super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.
}
init
来设置超类的实例变量等。这可能会返回不等于原始self
的内容,因此您需要将返回的内容分配给{ {1}}。 self
为非零,则表示超类控制的部分已正确初始化。现在,您执行初始化。所有实例变量都设置为self
(如果是对象)和nil
(如果它是整数)。您需要执行其他初始设置。 0
。返回的self
可能与分配的内容不同!因此,您需要将self
的结果分配给您的变量。这个建议是一个重要的教训:永远不要将通话分为init
和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
。
答案 1 :(得分:3)
最简单的形式:
alloc:分配的缩写,重新存储内存位置并返回指向该内存位置的指针。然后将该指针存储在k变量中。
init:初始化的简称,设置对象并返回对象。 init方法依赖于对象,但它通常涉及将init消息发送到超类。如果那个(超类)的init方法返回一个对象(不是nil),可能会根据该类的任务设置一些ivars。
-
init实现的示例,Schedule类使用空数组初始化其通道ivar。基本上,您为Schedule对象提供了自我排序的机会,因此它可以在创建后开始接收消息。你可以从init方法中删除通道初始化,但是你必须在Schedule类的每个方法中检查通道ivar是否为nil,如果它确实为零则初始化它。
- (Schedule*)init {
self = [super init];
if (self) {
channels = [[NSMutableArray alloc] initWithCapacity:0];
}
return self;
}
答案 2 :(得分:1)
alloc和init是从NSObject继承的两个方法 您可以提供自己的方法或调用NSObject
中的方法alloc分配内存以创建类的新实例(@interface) init初始化该实例的内容,默认情况下,init将所有成员值设置为0 / nil,但是您可以创建自己的init方法来自定义完成的操作。
Animal * k = [[Animal alloc] init]; // creates a new Animal object
你也可以写
Animal * k = [Animal new]; // which would be a bit more similar to other languages
答案 3 :(得分:0)
NSObject 根类提供了一种类方法 alloc , alloc:重新存储内存位置并返回指向该内存位置的指针。
alloc方法还有另一项重要任务,即通过将对象的属性设置为零来清除为对象属性分配的内存。
这避免了以前存储的包含垃圾的内存的常见问题,但是
不足以完全初始化对象。
您需要将对 alloc 的调用与 init 的调用结合起来,另一个是 NSObject方法:
(ID)的init; 类使用 init 方法来确保其属性在创建时具有合适的初始值。 分配和初始化对象的正确方法是将alloc调用嵌套在对init的调用中,如下所示:
ClassName * objectName = [ClassName alloc] init];
来自:apple documents
答案 4 :(得分:-1)
Alloc将为对象分配内存,但Init将对象放入内存并设置默认值。