《斯坦福大學(xué)公開課:iOS 7應(yīng)用開發(fā)》(第二課)

1.惰性初始化:不放在整個類的對象初始化中,放在離初始化數(shù)據(jù)最近的地方可以讓init的不需要初始化的垃圾更少。

2.OC里兩個函數(shù)的函數(shù)名和形參數(shù)量相同時,無論返回值類型和形參類型是否相同,都會出現(xiàn)編譯錯誤,這點跟java有區(qū)別。

例如:

-(void)test;

-(NSString *)test;

編譯錯誤。


-(void)test:(NSString *)parameter;

-(void)test:(NSArray *)parameter;

編譯錯誤。


-(void)test:(NSString *)parameter;

-(NSString *)test:(NSArray *)parameter;

編譯錯誤。


3.instancetype類型的init與id類型的init的區(qū)別在于:a.instancetype可以告訴編譯器回傳類型,讓編譯器在編譯階段就有足夠的信息判斷你寫的程序是否有問題,而id只能在執(zhí)行階段才能真正解析,編譯器就無法幫助你了。b.id可以作為形參類型出現(xiàn)在函數(shù)中,而instancetype只能作為返回值。更多分析請看下面這篇文章instancetype與id的區(qū)別。

另外,可能有人會問,為什么init不的返回值類型不設(shè)置成當前類的對象?問題是,該類的子類初始化的時候應(yīng)該返回的是子類的對象,如果父類將返回值類型寫死,這里就會出現(xiàn)問題。有人會覺得這也好辦,直接覆蓋這個初始化方法并返回子類的對象就好了嘛,但是這種語法是不合法的,請參見第二條。所以使用id或者instancetype完美的解決了這個問題。

4.self = [super init]檢測父類是否可以有效的初始化,如果可以才能初始化子類。

首先,通常情況下當某個對象收到消息時,系統(tǒng)會先從這個對象的類開始,查詢和消息名相同的方法名。如果沒有找到,則會在這個對象的父類中繼續(xù)查找,該查詢過程會沿著繼承路徑向上,知道找到相應(yīng)的方法為止,沒找到拋出異常。

需要這樣理解這行代碼:向super發(fā)送消息,其實是向self發(fā)送消息,但是要求系統(tǒng)在查找時跳過當前對象的類,從父類開始查找。

再多說一句,一個類可以有多個初始化方法,每個類都需要選定一個指定初始化方法,如果這個初始化方法與父類的指定初始化方法不同,需要覆蓋掉父類指定初始化方法并調(diào)用新的指定初始化方法。然后這個類中的其他初始化方法調(diào)用指定初始化方法完成相應(yīng)的初始化功能。

5.工具函數(shù)通??梢杂妙惡瘮?shù)來表示,這種不訪問任何實例變量的函數(shù)用類函數(shù)來表示更為合適。

6.重命名與視圖相關(guān)的outlet或者action的時候需要先將連接斷開命名再重新連接,這里特別需要注意,一旦忘記斷開,當你重新將view與controller連接時,就會出現(xiàn)空的強指針,此時運行模擬器將會在一開始就黑屏,系統(tǒng)無法有效的初始化view

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容