[Note] Effective OC - Item 23~25

Chapter 4. Protocols and Categories

<br />


Item 23: Use Delegate and Data Source Protocols for Inter-object Communication

<br />
這一節(jié)講了delegate的原理和使用場景。
大部分內(nèi)容我都比較熟悉,常寫常用片林,就不記筆記了依沮。這里只記一下最后提到了一塊用bitfield data type來定義delegate flag的內(nèi)容。這個(gè)用法沒有見過流昏,可能確實(shí)也不是很常用,文中用的詞是”is often overlooked”。
bitfield data type的聲明:

struct data {
 unsigned int fieldA : 8;
 unsigned int fieldB : 4;
};

這里表示fieldA有8個(gè)字節(jié)存儲(chǔ)空間缸榄,也就可以存儲(chǔ)2^8個(gè)值。如果用來做delegate flag祝拯,用于表示類有沒有相應(yīng)這個(gè)代理方法,只有響應(yīng)和沒響應(yīng)兩個(gè)情況她肯,所以1bit就夠了佳头。可以在interface里這樣寫:

@interface EOCNetworkFetcher () {
struct {
     unsigned int didUpdateProgressTo : 1;
}_delegateFlags;
}
@end

在setter里賦值:

_delegateFlags.didUpdateProgressTo = [delegate respondsToSelector: @selector(networkFetcher:didUpdateProgressTo:)];

這樣當(dāng)需要檢查代理是否有響應(yīng)代理方法的時(shí)候晴氨,就不用調(diào)用respondsToSelector方法康嘉,而是直接檢查flag就好了:

if (_delegateFlags: didUpdateProgressTo){
    //
}

這樣做的好處是判斷速度快,效率高籽前。需要做這樣優(yōu)化的場景是需要多次調(diào)用代理方法的時(shí)候亭珍。因?yàn)槊恳淮握{(diào)用敷钾,為了安全都要先判斷,如果不停地重復(fù)判斷肄梨,就會(huì)比較低效阻荒,這時(shí)就可以考慮用這種flag判斷來代替。
<br />


Item 24: Use Categories to Break Class Implementations into Manageable Segments

<br />
這一節(jié)講的是通過給類創(chuàng)建category來讓代碼的功能分區(qū)更清晰众羡。
在說category之前侨赡,我想先考慮一下category和inheritance怎么選擇的問題。一般來說粱侣,這兩個(gè)看上去最主要的區(qū)別是subclass可以添加新的屬性羊壹。但是在前面的<Item 10: Use Associated Objects to Attach Custom Data to Existing Classes>一節(jié)也提到了,可以用associated objects為category添加屬性齐婴,所以根據(jù)這一區(qū)別來判斷似乎也不是特別準(zhǔn)確油猫。我想應(yīng)該還是從OO的本身意義出發(fā)來想,inheritance并不是單純的“擴(kuò)展”柠偶,而是創(chuàng)建了一個(gè)新類情妖。這個(gè)新類應(yīng)該有它存在的意義。而category是真正意義上的擴(kuò)展嚣州,是針對(duì)原本的類增加功能鲫售,這些功能就是需要這個(gè)類來擁有的,而不是它的某個(gè)子集來擁有该肴。
一個(gè)類的implementation里寫了太多方法的話情竹,大多數(shù)人的習(xí)慣還是用#pragma mark -來進(jìn)行分區(qū)。這一節(jié)提出匀哄,用category來按功能分區(qū)效果更好秦效,而且如果沒必要把分類新建文件的話,大家仍可以都放在一個(gè)文件里涎嚼,利用分類名來說明每一塊的功能阱州。
這樣做的話,第一是代碼邏輯和功能更加清晰了法梯,更加self-documenting苔货。第二是在調(diào)試的時(shí)候在調(diào)用的方法后面可以看到屬于哪個(gè)分類,易于調(diào)試定位立哑。
特別地夜惭,對(duì)于不暴露給外界的方法,可以考慮創(chuàng)建private category铛绰。
<br />


Item 25: Always Prefix Category Names on Third-Party Classes

<br />
這一節(jié)很短诈茧,說的是要給分類的分類名和分類中的方法名加上前綴。
所有需要加前綴的東西捂掰,本質(zhì)原因都是為了避免沖突曾沈。放在分類這很好理解。因?yàn)榉诸惖姆椒ê皖惐緛砭陀械姆椒ㄊ菦]有優(yōu)先級(jí)之分的鸥昏,都會(huì)出現(xiàn)在類的方法列表里塞俱。如果同一個(gè)方法定義實(shí)現(xiàn)了多次,運(yùn)行時(shí)就不會(huì)知道執(zhí)行的是其中哪個(gè)互广,導(dǎo)致很奇怪又很難發(fā)現(xiàn)的bug敛腌。
特別是當(dāng)引入了第三方的類,不太清楚其內(nèi)部實(shí)現(xiàn)的情況下惫皱,這樣的危險(xiǎn)就更大像樊。
所以需要把分類名和分類中的方法名都加上前綴,人為建立name space旅敷,來避免命名沖突造成的方法相互覆蓋生棍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市媳谁,隨后出現(xiàn)的幾起案子涂滴,更是在濱河造成了極大的恐慌,老刑警劉巖晴音,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柔纵,死亡現(xiàn)場離奇詭異,居然都是意外死亡锤躁,警方通過查閱死者的電腦和手機(jī)搁料,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來系羞,“玉大人郭计,你說我怎么就攤上這事〗氛瘢” “怎么了昭伸?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澎迎。 經(jīng)常有香客問我庐杨,道長,這世上最難降的妖魔是什么夹供? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任辑莫,我火速辦了婚禮,結(jié)果婚禮上罩引,老公的妹妹穿的比我還像新娘。我一直安慰自己枝笨,他們只是感情好袁铐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布揭蜒。 她就那樣靜靜地躺著,像睡著了一般剔桨。 火紅的嫁衣襯著肌膚如雪屉更。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天洒缀,我揣著相機(jī)與錄音瑰谜,去河邊找鬼。 笑死树绩,一個(gè)胖子當(dāng)著我的面吹牛萨脑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饺饭,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼渤早,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘫俊?” 一聲冷哼從身側(cè)響起鹊杖,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扛芽,沒想到半個(gè)月后骂蓖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川尖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年登下,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空厌。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庐船,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘲更,到底是詐尸還是另有隱情筐钟,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布赋朦,位于F島的核電站篓冲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宠哄。R本人自食惡果不足惜壹将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毛嫉。 院中可真熱鬧诽俯,春花似錦、人聲如沸承粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仙粱,卻和暖如春房交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伐割。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工候味, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隔心。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓白群,卻偏偏與公主長得像,于是被迫代替她去往敵國和親济炎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子川抡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)须尚,斷路器崖堤,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 第 23 條:通過委托與數(shù)據(jù)源協(xié)議進(jìn)行對(duì)象間通信 Objective-C 可以使用 “委托模式”(Delegate...
    德山_閱讀 835評(píng)論 0 2
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評(píng)論 29 470
  • 這里僅記錄對(duì)我有幫助的內(nèi)容,不是對(duì)這本書的全面概括耐床。有些我目前還沒怎么用過的東西密幔,比如GCD,現(xiàn)在讀來還沒什么感覺...
    倫啊倫閱讀 304評(píng)論 0 1
  • 歸來的時(shí)候撩轰,踏著愛前進(jìn)胯甩。 下午五點(diǎn)。 他站在橋上堪嫂,頭往下望偎箫,是一條河。 風(fēng)吹著皆串,帶來夏天濕潤的氣息淹办,涼颼颼的,卻帶...
    北埃爾閱讀 418評(píng)論 1 1