alloc和init他们实际上做了什么
有人可以向我解释什么init和alloc在Obj-C中做什么。 我正在阅读这个obj-c书,它提供了一个创build对象的例子,但是它并没有详细描述它的function。 什么是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
,设置超类的实例variables等。这可能会返回一些不等于原来的self
,所以你需要分配什么返回self
。 - 如果
self
不为零,则意味着由超类控制的部分被正确初始化。 现在你执行你的初始化。 所有的实例variables都设置nil
(如果它是对象),如果是整数,则设置为0
。 您需要执行其他初始设置。 - 返回设置
self
。 返回的self
可能与分配的不同! 所以,你需要将init
的结果分配给你的variables。
- 首先,你需要调用超类的
这个build议一个重要的教训:永远不要把调用分配给init
和init
。 不要写:
MyClass* myObj = [MyClass alloc]; [myObj init];
因为[myObj init]
可能会返回其他内容。 不要试图通过写作来解决这个问题:
MyClass* myObj = [MyClass alloc]; myObj=[myObj init];
因为你最终会忘记在第二行写myObj=
的部分。
总是写:
MyClass* myObj = [[MyClass alloc] init];
我也不build议写:
MyClass* myObj = [MyClass new];
因为它没有正确调用初始化方法:有些类不接受普通的init
。 例如, NSView
需要initWithFrame:
NSView
不能用new
调用。 所以,不要使用new
。
最简单的forms是:
-
alloc:分配的空间,保留一个内存位置并返回指向该内存位置的指针。 这个指针然后被存储在kvariables中。
-
init:初始化的简称,设置对象并返回对象。 init方法取决于对象,但通常包括将init消息发送给超类。 如果(超类的)init方法返回一个对象(而不是nil),则可以根据该类的任务设置一些ivars。
–
一个init实现的例子,Schedule类用一个空的数组初始化它的通道。 基本上你给Schedule对象一个sorting的机会,所以一旦创build它就可以开始接收消息。 你可以从init方法中删除通道的初始化,但是你必须在Schedule类的每个方法中检查通道ivar是否为零,并且如果它确实为零,则初始化通道。
- (Schedule*)init { self = [super init]; if (self) { channels = [[NSMutableArray alloc] initWithCapacity:0]; } return self; }
alloc和init是从NSObjectinheritance的两个方法,你可以提供你自己的方法或调用NSObject中的方法
alloc分配内存以创build类的新实例(@interface)init初始化该实例的内容,默认情况下,init将所有成员值设置为0 / nil,但是您可以创build自己的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
NSObject 根类提供了一个类方法alloc , alloc:保留一个内存位置并返回指向该内存位置的指针。
alloc方法还有另外一个重要的任务,就是通过将分配给对象属性的内存设置为零来清除内存。
这避免了以前存储垃圾的内存通常的问题,但是
不足以完全初始化一个对象。
你需要调用alloc来调用init ,另一个NSObject方法:
-
(ID)初始化; init方法被一个类用来确保它的属性在创build时具有合适的初始值。 分配和初始化对象的正确方法是将调用内部的alloc调用嵌套到init,如下所示:
ClassName * objectName = [ClassName alloc] init];
来自:苹果文件
Alloc将为该对象分配内存,但Init将该对象放入内存并设置默认值。