alloc
是在物理內(nèi)存中分配了一塊內(nèi)存,并且返回一個指針豆胸。
MyClass* myObj = [MyClass alloc];
此時myObj
還不能使用常柄,因為它的內(nèi)存狀態(tài)還沒有得到正確的設置。
init
設置對象的初始化狀態(tài)并且將其返回摇予。注意:[a init]
的返回值并不一定是a自身 汽绢,原因如下:
-init{
self = [super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.}
- 首先,你需要調(diào)用超類的
init
方法去設置超類的實例變量等侧戴,其返回值不不一定等于原來的self
宁昭,所以你需要將返回值重新賦值給self. - 如果
self
非空,則表明被超類控制的部分已經(jīng)得到正確的初始化酗宋。詞時积仗,所有的實例變量都設置為nil
(如果是對象),或者0(如果是整型)蜕猫。接下來斥扛,你可以執(zhí)行額外的初始化設置。 - 返回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];
因為它不沒有正確地調(diào)用初始化方法,一些類不并可以使用簡單的init
方法稀颁,如NSView
需要initWithFrame:
,這樣就不能簡單地對其使用new
方法芬失,所以不建議使用new
方法創(chuàng)建對象。