Category,Extension,NSNotification,KVO記錄

category 作用

  • 聲明私有方法
  • 分解體積旁大的類文件
  • 把framework的私有方法公開

特點(diǎn)

編譯時(shí)編譯分類代碼,但是到運(yùn)行時(shí)才把分類方法屬性協(xié)議代理等添加到宿主類

  • 分類添加的方法可以"覆蓋"原類方法
  • 同名類方法誰(shuí)能生效取決于編譯順序
  • 名字相同的分類會(huì)引起編譯報(bào)錯(cuò)。

可以添加哪些內(nèi)容

  • 實(shí)例方法
  • 類方法
  • 協(xié)議
  • 屬性:只是添加了get和set方法,并沒(méi)有添加_property成員變量

category結(jié)構(gòu)體

struct category_t {
  const char *name;//分類名稱
  classref_t cls://所屬類
  struct method_list_t *instanceMethods;
  struct method_list_t *classMethods;
  struct protocol_list_t *protocols;
  struct property_list_t *instanceMethods;

  method_list_t *methodsForMeta(bool isMeta){
    if(isMeta) return classMethods;
    else return instanceMethods;
  }
property_list_t *propertiesForMeta_(bool isMeta){
if(isMeta)return nil;
else return instanceProperties;
}
}

擴(kuò)展(Extension)

  • 編譯時(shí)決議
  • 只以聲明的形式存在,多數(shù)情況下寄生于宿主類的m文件
  • 不能為系統(tǒng)類添加擴(kuò)展

代理(Delegate)

  • 一種軟件設(shè)計(jì)模式
  • iOS當(dāng)中以@protocol形式表現(xiàn)
  • 傳遞方式一對(duì)一

通知(NSNotification)
通知者發(fā)生消息,經(jīng)由通知中心向多個(gè)接收者發(fā)送消息

  • 使用觀察者模式來(lái)實(shí)現(xiàn)的用于跨層傳遞消息的機(jī)制
  • 傳遞方式一對(duì)多
    內(nèi)部大致有個(gè)map,以通知名為key,所有的觀察者列表為value。

KVO(key-value-observing)
KVO是Objective-C對(duì)觀察者設(shè)計(jì)模式的又一實(shí)現(xiàn)。
Apple使用了isa混寫(isa-swizzling)來(lái)實(shí)現(xiàn)KVO
當(dāng)調(diào)用addObserver方法后,系統(tǒng)會(huì)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建NSKVONotifying_A這么個(gè)類,將原來(lái)的類的isa指針指向這個(gè)類,通過(guò)重這個(gè)類的set方法實(shí)現(xiàn)通知觀察者

- (void)setValue:(id)obj
{
[self willChangeValueForKey:@"KeyPath"];
[super setValue:obj];
[self didChangeValueForKey:@"KeyPath"];
}

我們手動(dòng)調(diào)用[self willChangeValueForKey:@"KeyPath"];[self didChangeValueForKey:@"KeyPath"];這兩個(gè)方法也能達(dá)到調(diào)用監(jiān)聽回調(diào)的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • 上半年有段時(shí)間做了一個(gè)項(xiàng)目,項(xiàng)目中聊天界面用到了音頻播放,涉及到進(jìn)度條,當(dāng)時(shí)做android時(shí)候處理的不太好,由于...
    DaZenD閱讀 3,102評(píng)論 0 26
  • 1.設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,303評(píng)論 0 12
  • KVO概述 鍵值觀察Key-Value-Observer就是觀察者模式。 觀察者模式的定義:一個(gè)目標(biāo)對(duì)象管理所有依...
    小希嘻閱讀 704評(píng)論 0 0
  • 1. 果寶性格比較隨我,容易急躁。而他表現(xiàn)的方式就是一著急就哭。比如一件很小的事情:上樓按電梯,我們不小心順手給按...
    慢養(yǎng)娃閱讀 2,313評(píng)論 1 3

友情鏈接更多精彩內(nèi)容