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。