分配和初始化他们实际做了什么

时间:2010-10-03 07:37:24

标签: objective-c

有人可以向我解释一下init和alloc在Obj-C中做了什么。我正在阅读这本obj-c书,它提供了一个创建对象的例子,但它并没有详细说明它的作用。 alloc返回什么?什么是init返回?

Animal * k = [Animal alloc];
k = [k init];

5 个答案:

答案 0 :(得分:40)

  • alloc分配一块内存来保存对象,并返回指针。

    MyClass* myObj = [MyClass alloc];
    

    myObj尚未使用,因为其内部状态未正确设置。所以,不要写这样的代码。

  • init设置对象的初始条件并返回它。请注意 [a init] 返回的内容可能与a不同。这解释了Yannick写的代码:

    -init{
         self=[super init]; // 1.
         if(self){          // 2.
             ....
         }
         return self;       // 3.
    }
    
    1. 首先,您需要调用超类的init来设置超类的实例变量等。这可能会返回不等于原始self的内容,因此您需要将返回的内容分配给{ {1}}。
    2. 如果self为非零,则表示超类控制的部分已正确初始化。现在,您执行初始化。所有实例变量都设置为self(如果是对象)和nil(如果它是整数)。您需要执行其他初始设置。
    3. 返回设置0。返回的self可能与分配的内容不同!因此,您需要将self的结果分配给您的变量。

这个建议是一个重要的教训:永远不要将通话分为initalloc。不要写:

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将对象放入内存并设置默认值。