第五章 內(nèi)存管理
1.ARC并不會調(diào)用retain
、release
等方法览闰,而是直接調(diào)用其底層C語言版本objc_retain
等赫模,所以ARC沒有普通的OC消息派發(fā)機(jī)制。
2.如果setter
方法像下面這樣寫丐吓,當(dāng)新值和舊值相同時就程序就會崩潰浅悉。
-(void)setObject:(id)object{
[_object release];
_object=[object retain];
}
3.ARC中的命名規(guī)則:如果方法名以alloc
、new
汰蜘、copy
仇冯、mutableCopy
開頭,則返回對象歸調(diào)用者所有族操,否則返回的對象會自動釋放苛坚。
4.dealloc方法里要釋放指向其他對象的引用,取消鍵值觀測(KVO)和NSNotificationCenter
通知色难,不要在這里執(zhí)行異步任務(wù)或應(yīng)該在正常狀態(tài)下執(zhí)行的任務(wù)泼舱,因?yàn)檫@是的對象已經(jīng)處于正在回收狀態(tài)了。
5.ARC默認(rèn)不生成安全處理異常的代碼枷莉,設(shè)置-fobjc-arc-exceptions標(biāo)志后可以開啟娇昙,不過會導(dǎo)致應(yīng)用程序變大,效率變低笤妙。
6.unsafe_unretain
和weak
都可以用來消除循環(huán)引用冒掌,區(qū)別是前者在引用移除后仍然指向已經(jīng)回收的對象,后者則會自動設(shè)為nil
蹲盘,所以使用weak
會安全一點(diǎn)股毫,因?yàn)橄?code>nil發(fā)送消息不會報(bào)錯。
7.利用自動釋放池可以避免內(nèi)存峰值的出現(xiàn)召衔。
第六章 塊與大中樞派發(fā)
1.下圖是塊的內(nèi)部結(jié)構(gòu):
上圖中首個變量是個isa指針铃诬,所以塊本身是一個對象。那么塊和普通函數(shù)有什么區(qū)別呢苍凛?除了塊是個對象外趣席,其實(shí)最大的區(qū)別就是塊比函數(shù)多了個上下文環(huán)境,塊內(nèi)部可以調(diào)用外部的變量醇蝴,對應(yīng)上圖的variables
宣肚,而descriptor
內(nèi)部則會對捕獲的變量進(jìn)行管理。
2.塊分為全局塊NSConcreteGlobalBlock
悠栓、棧塊NSConcreteStackBlock
钉寝、堆塊NSConcreteMallocBlock
,在ARC中只有全局塊和堆塊了闸迷。
3.利用typedef
創(chuàng)建塊,然后將handler塊作為參數(shù)傳給方法俘枫,以降低代碼分散程度腥沽。這種方法編寫類的時候特別要注意塊的保留環(huán),記得要把塊在適當(dāng)時機(jī)釋放掉鸠蚪,解除保留環(huán)今阳。在AFNetworking中师溅,是把所有competition塊保存在字典中,當(dāng)請求結(jié)束時盾舌,再移除墓臭,其他開源庫的做法也都大同小異。
4.GCD和NSOperationQueue
:前者是純C的API妖谴,且更加輕量窿锉,后者是Objective-C對象,可以取消操作膝舅、設(shè)置依賴關(guān)系嗡载、同一隊(duì)列中各操作的優(yōu)先級設(shè)置。
5.不要使用dispatch_get_current_queue
仍稀,因?yàn)橥鵄線程里面又有B線程洼滚,所以在B中檢測當(dāng)前線程就會產(chǎn)生歧義。
第七章 系統(tǒng)框架
1.多用塊枚舉技潘,少用for循環(huán)遥巴,另外也可以使用for in這種快速遍歷的方法。
2.load
和initialize
里面的代碼一定要精簡享幽。不要在里面調(diào)用其他類的方法铲掐,因?yàn)槎鄠€類之間執(zhí)行load
的順序是不確定的,而且load
不參與繼承機(jī)制琉闪。initialize
會在類被第一次調(diào)用時執(zhí)行一次迹炼,和load
一樣,不要再里面調(diào)用其他類的方法颠毙。
3.NSTimer
會保留目標(biāo)對象斯入,所以很容易造成循環(huán)引用,調(diào)用invalidate
方法可以使timer失效蛀蜜,但是別把這項(xiàng)工作交給調(diào)用者刻两,你永遠(yuǎn)無法保證調(diào)用者一定會調(diào)用invalidate
。
結(jié)語
這本書其實(shí)早就看完了滴某,寫這幾篇博客時磅摹,這本書差不多看了快三遍了,里面很多知識點(diǎn)對提升編程質(zhì)量還是很有幫助的霎奢,在看一些開源iOS框架的時候户誓,很多細(xì)節(jié)上的處理都能在這本書上找到解釋。