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è)置成當(dāng)前類的對象哼拔?問題是引有,該類的子類初始化的時候應(yīng)該返回的是子類的對象,如果父類將返回值類型寫死倦逐,這里就會出現(xiàn)問題譬正。有人會覺得這也好辦,直接覆蓋這個初始化方法并返回子類的對象就好了嘛檬姥,但是這種語法是不合法的曾我,請參見第二條。所以使用id或者instancetype完美的解決了這個問題健民。
4.self = [super init]檢測父類是否可以有效的初始化抒巢,如果可以才能初始化子類。
首先荞雏,通常情況下當(dāng)某個對象收到消息時虐秦,系統(tǒng)會先從這個對象的類開始,查詢和消息名相同的方法名凤优。如果沒有找到悦陋,則會在這個對象的父類中繼續(xù)查找,該查詢過程會沿著繼承路徑向上筑辨,知道找到相應(yīng)的方法為止俺驶,沒找到拋出異常。
需要這樣理解這行代碼:向super發(fā)送消息棍辕,其實是向self發(fā)送消息暮现,但是要求系統(tǒng)在查找時跳過當(dāng)前對象的類,從父類開始查找楚昭。
再多說一句栖袋,一個類可以有多個初始化方法,每個類都需要選定一個指定初始化方法抚太,如果這個初始化方法與父類的指定初始化方法不同塘幅,需要覆蓋掉父類指定初始化方法并調(diào)用新的指定初始化方法昔案。然后這個類中的其他初始化方法調(diào)用指定初始化方法完成相應(yīng)的初始化功能。
5.工具函數(shù)通车缦保可以用類函數(shù)來表示踏揣,這種不訪問任何實例變量的函數(shù)用類函數(shù)來表示更為合適。
6.重命名與視圖相關(guān)的outlet或者action的時候需要先將連接斷開命名再重新連接匾乓,這里特別需要注意捞稿,一旦忘記斷開,當(dāng)你重新將view與controller連接時拼缝,就會出現(xiàn)空的強指針娱局,此時運行模擬器將會在一開始就黑屏,系統(tǒng)無法有效的初始化view珍促。