objective-c - alloc 和 init 它们实际上做了什么

标签 objective-c

谁能给我解释一下 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.
    }
    
    1. 首先,您需要调用父类(super class)的init,设置父类(super class)的实例变量等。这可能会返回一些不等于原始self的东西,所以您需要将返回的内容分配给 self
    2. 如果self 不为nil,则表示父类(super class)控制的部分已正确初始化。现在执行初始化。所有实例变量都设置为 nil(如果它是对象)和 0(如果它是整数)。您需要执行额外的初始设置。
    3. 返回设置self。返回的 self 可能与分配的不同!因此,您需要将 init 的结果分配给您的变量。

这暗示了一个重要的教训:永远不要将对 allocinit 的调用分开。不要写:

 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/

相关文章:

ios - 如何删除 UITabBarItem selectionImage 填充?

iOS:当拖动到指定区域时如何仅确定一次按钮的位置

iphone - MPMoviePlayerController iO7 问题

ios - 我如何确定 NSData 的内容何时指示 Web 服务请求失败?

objective-c - IOS - 如何在 UIApplication 之外创建模式用户/密码?

objective-c - 有没有一种方法可以为 NSData 添加一个 NSString ?

iphone - 如何使用相同类型的子对象计算自定义对象的深度?

iphone - objective-c 中的子类化和继承

ios - UITableViews 和 UITableViewCells

ios - NSUserDefaults standardUserDefaults setInteger for a long long int