老司機(jī)讀書筆記——Effective Objective-C 2.0閱讀筆記

Effective Objective-C 2.0閱讀筆記

這篇文章你將看到以下內(nèi)容:

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

1.對象內(nèi)部盡量直接訪問實例變量

直接訪問實例變量為直接訪問內(nèi)存,效率比調(diào)用屬性高。

  • 訪問實例變量不會觸發(fā)KVO
  • -init-dealloc方法中應(yīng)使用實例變量
  • 對象內(nèi)部應(yīng)盡量遵守如下原則:取值采用實例變量求类,賦值采用屬性撞叽。

2.消息轉(zhuǎn)發(fā)機(jī)制流程

消息轉(zhuǎn)發(fā)流程

3.盡量使用不可變對象

  • 集合中盡量添加不可變對象,否則可能會發(fā)生與集合本身語義有分歧的后果,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應(yīng)只有一個元素停蕉,然實測有兩個相同元素
  • 對象對外公開集合類盡量使用不可變集合
  • 對象對外公開readOnly屬性勺三,內(nèi)部可以通過重新聲明為readWrite來使用屬性值雷滚。如此操作后和能會由于競態(tài)使得部分情況外部可以修改屬性值,外部也可通過KVC來更改屬性值

4.將類的實現(xiàn)代碼分散到便于管理的數(shù)個分類之中

通過分類機(jī)制吗坚,可以把類代碼分成很多個易于管理的小塊祈远,以便單獨檢視。

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

將應(yīng)該視為“私有”的方法歸入名叫Private的分類中牡彻,以隱藏實現(xiàn)細(xì)節(jié)扫沼。


5.在-dealloc中只釋放引用并解除監(jiān)聽

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

6.以自動釋放池降低內(nèi)存峰值

比方說,在循環(huán)中不斷地創(chuàng)建的臨時對象衰倦。即便這些對象在調(diào)用完方法之后就就不在使用了袒炉,他們也依然處于存活狀態(tài),因為目前還在自動釋放池里樊零,等待系統(tǒng)稍后將其釋放并回收我磁。然而,自動釋放池要等線程執(zhí)行下一次runLoop時才會清空驻襟。這樣依賴夺艰,執(zhí)行for循環(huán)時,應(yīng)用程序所占內(nèi)存量就會持續(xù)上漲沉衣,而等到所有臨時對象都釋放后郁副,內(nèi)存用量又會突然下降。

然而在循環(huán)中合理的位置添加自動釋放池豌习,應(yīng)用程序在執(zhí)行循環(huán)時的內(nèi)存峰值就會降低存谎。


7.多用派發(fā)隊列,少用同步鎖

濫用@synchronized(self)會降低代碼效率肥隆,因為共用同一個鎖的那些同步塊既荚,都必須按順序執(zhí)行。若想實現(xiàn)同步機(jī)制栋艳,可以以并行隊列恰聘、同步任務(wù)及柵欄實現(xiàn),代碼如下:

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

///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方法是否具有返回值晴叨,故編譯器沒有對對象進(jìn)行引用計數(shù)管理,因此可能造成內(nèi)存泄漏矾屯。

另外performSelector返回值只能是id類型的對象篙螟,基本數(shù)據(jù)類型可能需要開發(fā)人員進(jìn)行進(jìn)一步的類型轉(zhuǎn)換。

如果想要添加延時任務(wù)问拘,條件允許的情況下應(yīng)盡可能選擇GCD遍略。


9.合理使用GCD與NSOperation

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

  • 取消操作
  • 指定依賴關(guān)系
  • 提供KVO監(jiān)聽
  • 指定優(yōu)先級
  • 重用對象

10.多用Block枚舉下愈,少用for循環(huán)

Block枚舉擁有其他遍歷方式具備的所有優(yōu)勢,而且還能帶來更多好處蕾久。與快速遍歷法相比势似,他還要多用一些代碼,可是卻能提供遍歷時所針對的下標(biāo)僧著,在遍歷字典時也能同時提供鍵與值履因,而且還有選項可以開啟并發(fā)迭代功能,所以多寫這點代碼還是值得的盹愚。


11.精簡+initialize與+load的實現(xiàn)代碼

  • 在加載階段栅迄,如果類實現(xiàn)了+load方法,那么系統(tǒng)就會先調(diào)用他皆怕。分類里也可以定義此方法毅舆,類的+load方法要比分類中的先調(diào)用。與其他方法不同愈腾,+load方法不參與覆寫機(jī)制憋活。
  • 首次使用某個類之前,系統(tǒng)會向其發(fā)送+initialize消息虱黄。由于此方法遵從普通的覆寫機(jī)制悦即,所以通常應(yīng)該在里面判斷當(dāng)前要初始化的是哪個類。
  • +load+initialize方法都應(yīng)該實現(xiàn)的精簡一些橱乱,這有助于保持應(yīng)用程序的響應(yīng)能力盐欺,也能減少引入“依賴環(huán)”的幾率。
  • 無法在編譯器設(shè)定的全局常量仅醇,可以放在+initialize方法里初始化。

好的魔种,今天的內(nèi)容就到這里了析二,有什么問題可以來老司機(jī)的個人博客GitHub或者郵件我节预。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叶摄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子安拟,更是在濱河造成了極大的恐慌蛤吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠赦,死亡現(xiàn)場離奇詭異会傲,居然都是意外死亡锅棕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淌山,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸燎,“玉大人,你說我怎么就攤上這事泼疑〉侣蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵退渗,是天一觀的道長移稳。 經(jīng)常有香客問我,道長会油,這世上最難降的妖魔是什么个粱? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钞啸,結(jié)果婚禮上几蜻,老公的妹妹穿的比我還像新娘。我一直安慰自己体斩,他們只是感情好梭稚,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著絮吵,像睡著了一般弧烤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬敲,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天暇昂,我揣著相機(jī)與錄音,去河邊找鬼伴嗡。 笑死急波,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘪校。 我是一名探鬼主播澄暮,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阱扬!你這毒婦竟也來了泣懊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤麻惶,失蹤者是張志新(化名)和其女友劉穎馍刮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窃蹋,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡卡啰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年静稻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎乃。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡姊扔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梅誓,到底是詐尸還是另有隱情恰梢,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布梗掰,位于F島的核電站嵌言,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏及穗。R本人自食惡果不足惜摧茴,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埂陆。 院中可真熱鬧苛白,春花似錦、人聲如沸焚虱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹃栽。三九已至躏率,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間民鼓,已是汗流浹背薇芝。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留丰嘉,地道東北人夯到。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像饮亏,于是被迫代替她去往敵國和親耍贾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容