【语法解释】init
init
(id)init {
// 先讓父類別進(jìn)行初始化
??if (self = [super init]) {
// do something
}
return self;
}
?
if(self=[super init]) 首先的是[super init],使超類完成自己的初始化工作。
if(self=[super ?init])這條語句的意思,[super ?init]是初始化父類中的變量方法,self=[super ?init]就相當(dāng)于子類也初始化了這些變量和方法,而用if判斷下,是為了防止self為空的情況,即創(chuàng)建失敗的情況。
self被指定為返回值,這個返回值通過self =[super ?init]中發(fā)送給super對象的init消息得來。它只意味著在Object-C中我們必須手工調(diào)用父類得init方法。沒有對父類的自動調(diào)用。我們必須指定self為[super ?init]的返回值,因為它可能會返回nil。(非常重要的語法知識)
Objective-C創(chuàng)建對象需通過兩個消息:alloc以及init。alloc的作用是分派存儲器空間,init則是對對象做初始化。init與alloc都是定義在NSObject里的類方法,當(dāng)對象收到這兩個消息并做出正確回應(yīng)后,新實體才算準(zhǔn)備妥當(dāng)。
?
特別注意:在Objective-c中,這句話中,if(self=[super init])為什么不用“==”而用"="
這里不是判斷self與[super init]是否相等,而是判斷是否可以成功初始化。
[super init]:父類初始化成功的話,通過=給self,這樣self成為一個非空對象,整個來說即非false(非NO)。
于是也就變成了:
if ( !false )
{
?? //成功初始化后執(zhí)行的代碼
}?
如果init失敗 self則為空 if條件為假,于是if段內(nèi)語句不執(zhí)行
?
父類進(jìn)行初始化時,用的是子類對象指針self,父類的init方法有可能對這個指針指向的內(nèi)存區(qū)作了大的變更(有可能把這個指針?biāo)傅膬?nèi)存釋放了,
重新分配了另一塊內(nèi)存區(qū)域返回來,這時這個返回的指針與原來的指針是指向不同地址的),所以父類初始化后要重新返回指針。
父類返回的和子類的self的類型都為id類型(通用類型)。父類的init方法若返回的指針與self不一樣,
在父類的init方法中已作了release和新的內(nèi)存分配,不需要自己再去release sef,直接用父類init方法返回的指針就可以了。
轉(zhuǎn)載于:https://www.cnblogs.com/madeininfi/p/3531668.html
總結(jié)
以上是生活随笔為你收集整理的【语法解释】init的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解耦HTML、CSS和JavaScrip
- 下一篇: WebStorm荣获InfoWorld2