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. } 
    1. 首先,你需要调用超类的init ,设置超类的实例variables等。这可能会返回一些不等于原来的self ,所以你需要分配什么返回self
    2. 如果self不为零,则意味着由超类控制的部分被正确初始化。 现在你执行你的初始化。 所有的实例variables都设置nil (如果它是对象),如果是整数,则设置为0 。 您需要执行其他初始设置。
    3. 返回设置self 。 返回的self可能与分配的不同! 所以,你需要将init的结果分配给你的variables。

这个build议一个重要的教训:永远不要把调用分配给initinit 。 不要写:

  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 根类提供了一个类方法allocalloc:保留一个内存位置并返回指向该内存位置的指针。

alloc方法还有另外一个重要的任务,就是通过将分配给对象属性的内存设置为零来清除内存。

这避免了以前存储垃圾的内存通常的问题,但是

不足以完全初始化一个对象。

你需要调用alloc来调用init ,另一个NSObject方法:

  • (ID)初始化; init方法被一个类用来确保它的属性在创build时具有合适的初始值。 分配和初始化对象的正确方法是将调用内部的alloc调用嵌套到init,如下所示:

    ClassName * objectName = [ClassName alloc] init];

来自:苹果文件

Alloc将为该对象分配内存,但Init将该对象放入内存并设置默认值。