(六) 協(xié)議與分類

第23條:通過委托與數據源協(xié)議進行對象間通信懒叛。

Objective-C廣泛使用委托模式(Delegate patttern)來實現對象間的通信,其主旨是:為對象A定義一套接口骤铃,對象B接受對象A的委托绩蜻,需要遵從這套接口礁苗。通過接口,對象A在發(fā)生事件時可以通知對象B级解,也可以向對象B傳遞信息冒黑。接口通常以協(xié)議(protocol)方式呈現。

委托模式可將數據與業(yè)務邏輯解耦勤哗。比如抡爹,UI視圖只應包含顯示數據邏輯,其數據交互處理可交由委托對象處理芒划。視圖一般包含負責數據的數據源(data source)對象和負責事件的委托(delegate)對象冬竟。為避免循環(huán)引用,視圖對委托屬性必須是非擁有關系民逼,需要使用weak關鍵字诱咏。

協(xié)議中使用@optional關鍵字表示委托對象可選擇是否實現方法,調用該方法前需要先用respondsToSelector:來檢測方法是否已實現缴挖,判斷結果特定場景下可緩存起來袋狞,減少檢測次數。

協(xié)議中必須實現的方法通常用于強制實現的接口規(guī)范映屋,可直接調用苟鸯。


第24條:將類的代碼分散到便于管理的多個分類中。

Objective-C分類機制棚点,可以把類代碼按邏輯劃入幾個分區(qū)中早处,利于開發(fā)和調試。類的基本要素瘫析,如屬性砌梆、初始化方法等都在主實現(main implement)聲明,不同類型的操作方法則歸入各個分類中贬循。

編寫程序庫時咸包,可以考慮創(chuàng)建private分類,實現私有方法杖虾,隱藏實現細節(jié)烂瘫。


第25條:為第三方類的分類及其方法名加上前綴。

因為Objective-C分類可以多個并存奇适,為第三方類添加分類坟比,使用簡單名稱芦鳍,可能會存在同名分類和相同方法,導致其中一個分類方法被覆蓋葛账,有可能產生非預期結果柠衅。解決問題的建議是為分類及其方法名加上專用前綴,降低沖突幾率籍琳。


第26條:分類中盡量不要聲明屬性菲宴。

分類無法合成與屬性相關的實例變量,如果在分類聲明屬性巩割,需要為該屬性實現存取方法裙顽,可聲明為@dynamic,到運行期才能提供宣谈,編譯期不可見愈犹。

關聯(lián)對象能夠解決分類中不能合成實例變量的問題,需要遵從內存慣例語義闻丑。一般情況下并不推薦使用關聯(lián)對象漩怎,因此,應盡量在主實現聲明屬性嗦嗡。


第27條:使用class-continuation分類隱藏實現細節(jié)勋锤。

class-continuation分類定義在類的實現文件中,用于隱藏實現細節(jié)侥祭,格式如下

@interface className () {

//?實例變量

}

// proterty

// method

@end

Objective-C可能包含C++代碼叁执,如果在頭文件引入C++頭文件,那么實現文件不能使使用.m擴展名矮冬,而要使用.mm擴展名谈宛。如果使用C++編寫的第三庫采用這種方式,則必須要求使用者的實現文件使用.mm擴展名胎署,這樣做不太合適吆录。使用class-continuation分類添加C++的實例變量可以解決這個問題,只需要在實現文件引入C++頭文件琼牧,對外提供的純Objective-C接口恢筝,對于使用者來說比較友好。

class-continuation分類還有一種用法巨坊,是把在public接口聲明為只讀的屬性撬槽,擴展為可讀寫。這樣外部無法修改屬性抱究,內部比較容易管理數據恢氯。例如

頭文件聲明類

@interface EOCPerson : NSObject

@property (nonatomic, copy, readonly) NSString * firstName;

@end

實現文件可使用class-continuation分類進行擴展

@interface EOCPerson ()

@property (nonatomic, copy, readwrite) NSString * firstName;

@end

如果需要隱藏協(xié)議細節(jié),也可以使用class-continuation分類鼓寺,例如

@interface EOCPerson () <EOCSecretDelegate>

@end


第28條:通過協(xié)議提供匿名對象勋拟。

Objective-C可以用協(xié)議把API實現細節(jié)隱藏起來,對外僅提供遵從協(xié)議對id類型(匿名對象妈候,anonymous object)敢靡。使用者不知道API的名稱和細節(jié),也不關心苦银。匿名對象表明具體類型并不重要啸胧,僅需要能響應協(xié)議方法。在程序設計中幔虏,同一套協(xié)議接口纺念,可能會由不同的對象來實現。數據持久化常使用匿名對象想括,如數據庫陷谱、文件處理、緩存等等瑟蜈。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末烟逊,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子铺根,更是在濱河造成了極大的恐慌宪躯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位迂,死亡現場離奇詭異访雪,居然都是意外死亡,警方通過查閱死者的電腦和手機掂林,發(fā)現死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門臣缀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人党饮,你說我怎么就攤上這事肝陪。” “怎么了刑顺?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵氯窍,是天一觀的道長。 經常有香客問我蹲堂,道長狼讨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任柒竞,我火速辦了婚禮政供,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己布隔,他們只是感情好离陶,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衅檀,像睡著了一般招刨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哀军,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天沉眶,我揣著相機與錄音,去河邊找鬼杉适。 笑死谎倔,一個胖子當著我的面吹牛,可吹牛的內容都是我干的猿推。 我是一名探鬼主播片习,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彤守!你這毒婦竟也來了毯侦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤具垫,失蹤者是張志新(化名)和其女友劉穎侈离,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體筝蚕,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡卦碾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了起宽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洲胖。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坯沪,靈堂內的尸體忽然破棺而出绿映,到底是詐尸還是另有隱情,我是刑警寧澤腐晾,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布叉弦,位于F島的核電站,受9級特大地震影響藻糖,放射性物質發(fā)生泄漏淹冰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一巨柒、第九天 我趴在偏房一處隱蔽的房頂上張望樱拴。 院中可真熱鬧柠衍,春花似錦、人聲如沸晶乔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘪弓。三九已至垫蛆,卻和暖如春禽最,著一層夾襖步出監(jiān)牢的瞬間腺怯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工川无, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呛占,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓懦趋,卻偏偏與公主長得像晾虑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仅叫,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容