老司機讀書筆記——Effective Objective-C 2.0閱讀筆記

Effective Objective-C 2.0閱讀筆記

這篇文章你將看到以下內容:

  • Efficetive Objective-C 2.0閱讀筆記一些有價值的建議

1.對象內部盡量直接訪問實例變量

直接訪問實例變量為直接訪問內存,效率比調用屬性高。

  • 訪問實例變量不會觸發KVO
  • -init-dealloc方法中應使用實例變量
  • 對象內部應盡量遵守如下原則:取值采用實例變量,賦值采用屬性。

2.消息轉發機制流程

消息轉發流程

3.盡量使用不可變對象

  • 集合中盡量添加不可變對象,否則可能會發生與集合本身語義有分歧的后果,eg:
NSMutableArray * arr1 = @[@1].mutableCopy;
NSMutableArray * arr2 = @[@1,@2].mutableCopy;
NSSet * set = [NSSet setWithObjects:arr1,arr2, nil];
[arr1 addObject:@2];//至此set中居然包含了兩個相同的元素
NSSet * setCopy = [set copy];//書中此處表述setCopy應只有一個元素,然實測有兩個相同元素
  • 對象對外公開集合類盡量使用不可變集合
  • 對象對外公開readOnly屬性,內部可以通過重新聲明為readWrite來使用屬性值。如此操作后和能會由于競態使得部分情況外部可以修改屬性值,外部也可通過KVC來更改屬性值

4.將類的實現代碼分散到便于管理的數個分類之中

通過分類機制,可以把類代碼分成很多個易于管理的小塊,以便單獨檢視。

之所以要將類代碼打散到分類中還有個原因,就是便于調試:對于某個分類中的所有方法來說,分類名稱都會出現在其符號中。

將應該視為“私有”的方法歸入名叫Private的分類中,以隱藏實現細節。


5.在-dealloc中只釋放引用并解除監聽

  • -dealloc方法里,應該做的事情就是釋放指向其他對象的引用,并取消原來訂閱的“鍵值觀測”(KVO)或NSNotificationCenter等通知,不要做其他事情。
  • 如果對象持有文件描述符等系統資源,那么應該專門編寫一個方法來釋放此種資源。這樣的類要和其他使用者約定:用完資源后必須調用close方法。
  • 執行異步任務的方法不應再-dealloc里調用;只能子啊正常狀態下執行的那些方法也不應在-dealloc里調用,因為此時對象已處于正在回收的狀態了。

6.以自動釋放池降低內存峰值

比方說,在循環中不斷地創建的臨時對象。即便這些對象在調用完方法之后就就不在使用了,他們也依然處于存活狀態,因為目前還在自動釋放池里,等待系統稍后將其釋放并回收。然而,自動釋放池要等線程執行下一次runLoop時才會清空。這樣依賴,執行for循環時,應用程序所占內存量就會持續上漲,而等到所有臨時對象都釋放后,內存用量又會突然下降。

然而在循環中合理的位置添加自動釋放池,應用程序在執行循環時的內存峰值就會降低。


7.多用派發隊列,少用同步鎖

濫用@synchronized(self)會降低代碼效率,因為共用同一個鎖的那些同步塊,都必須按順序執行。若想實現同步機制,可以以并行隊列、同步任務及柵欄實現,代碼如下:

_syncQueue = dispatch_queue_create("com.syncQ.Wicky", DISPATCH_QUEUE_CONCURRENT);///創建并行隊列

///getter
-(NSString *)someString {
    __block NSString * localString;
    dispatch_sync(_syncQueue, ^{
        localString = _someString;
    });
    return localString;
}

///setter
-(void)setSomeString:(NSString *)someString {
    dispatch_barrier_async(_syncQueue, ^{
        _someString = someString;
    });
}

8.多用GCD,少用performSelector系列方法

由于在編譯器無法確定performSelector方法是否具有返回值,故編譯器沒有對對象進行引用計數管理,因此可能造成內存泄漏。

另外performSelector返回值只能是id類型的對象,基本數據類型可能需要開發人員進行進一步的類型轉換。

如果想要添加延時任務,條件允許的情況下應盡可能選擇GCD。


9.合理使用GCD與NSOperation

GCD為純C的API,而NSOperation則是OC對象。與NSOperation比起來GCD更加輕量,然而NSOperation卻有以下幾點在使用上更加便捷:

  • 取消操作
  • 指定依賴關系
  • 提供KVO監聽
  • 指定優先級
  • 重用對象

10.多用Block枚舉,少用for循環

Block枚舉擁有其他遍歷方式具備的所有優勢,而且還能帶來更多好處。與快速遍歷法相比,他還要多用一些代碼,可是卻能提供遍歷時所針對的下標,在遍歷字典時也能同時提供鍵與值,而且還有選項可以開啟并發迭代功能,所以多寫這點代碼還是值得的。


11.精簡+initialize與+load的實現代碼

  • 在加載階段,如果類實現了+load方法,那么系統就會先調用他。分類里也可以定義此方法,類的+load方法要比分類中的先調用。與其他方法不同,+load方法不參與覆寫機制。
  • 首次使用某個類之前,系統會向其發送+initialize消息。由于此方法遵從普通的覆寫機制,所以通常應該在里面判斷當前要初始化的是哪個類。
  • +load+initialize方法都應該實現的精簡一些,這有助于保持應用程序的響應能力,也能減少引入“依賴環”的幾率。
  • 無法在編譯器設定的全局常量,可以放在+initialize方法里初始化。

好的,今天的內容就到這里了,有什么問題可以來老司機的個人博客GitHub或者郵件我

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容