alloc
是在物理内存中分配了一块内存,并且返回一个指针。
MyClass* myObj = [MyClass alloc];
此时myObj
还不能使用,因为它的内存状态还没有得到正确的设置。
init
设置对象的初始化状态并且将其返回。注意:[a init]
的返回值并不一定是a自身 ,原因如下:
-init{
self = [super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.}
- 首先,你需要调用超类的
init
方法去设置超类的实例变量等,其返回值不不一定等于原来的self
,所以你需要将返回值重新赋值给self. - 如果
self
非空,则表明被超类控制的部分已经得到正确的初始化。词时,所有的实例变量都设置为nil
(如果是对象),或者0(如果是整型)。接下来,你可以执行额外的初始化设置。 - 返回self
因为init
和alloc
的返回值不一定相等,所以不要讲两个方法分开使用,如以下代码:
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
方法创建对象。