Objective-C中的Alloc 和init

alloc 是在物理内存中分配了一块内存,并且返回一个指针。

MyClass* myObj = [MyClass alloc];

此时myObj还不能使用,因为它的内存状态还没有得到正确的设置。
init 设置对象的初始化状态并且将其返回。注意:[a init] 的返回值并不一定是a自身 ,原因如下:

-init{ 
 self = [super init]; // 1.
 if(self){    // 2. 
       ....
 } 
return self; // 3.}
  1. 首先,你需要调用超类的init 方法去设置超类的实例变量等,其返回值不不一定等于原来的self ,所以你需要将返回值重新赋值给self.
  2. 如果self 非空,则表明被超类控制的部分已经得到正确的初始化。词时,所有的实例变量都设置为nil (如果是对象),或者0(如果是整型)。接下来,你可以执行额外的初始化设置。
  3. 返回self

因为initalloc的返回值不一定相等,所以不要讲两个方法分开使用,如以下代码:

MyClass* myObj = [MyClass alloc]; 
[myObj init];

也不建议使用以下写法:

 MyClass* myObj = [MyClass alloc]; 
myObj=[myObj init];

因为你很有可能忘记写myObj=
永远使用以下写法:

 MyClass* myObj = [[MyClass alloc] init];

也不建议使用new 方法

MyClass* myObj = [MyClass new];

因为它不没有正确地调用初始化方法,一些类不并可以使用简单的init 方法,如NSView 需要initWithFrame:,这样就不能简单地对其使用new方法,所以不建议使用new 方法创建对象。

你可能感兴趣的:(Objective-C中的Alloc 和init)