聊聊KVO

iOS中的KVO用起來還是蠻爽的玩讳,特別適合用在Model更改后刷新UI等操作,可以很方便的監(jiān)聽一個對象屬性值的變化絮姆,只需要對目標(biāo)對象添加觀察者即可

了解了基本操作后羊壹,我們再深入了解下它是如何實現(xiàn)的

那我們從addObserver函數(shù)開始,函數(shù)接受四個參數(shù)叁执,分別是:

  • observer:注冊KVO的對象茄厘,且需要實現(xiàn)了observeValueForKeyPath:ofObject:change:context:方法

  • keyPath: 接受消息的關(guān)鍵路徑,不能為空谈宛,可在接受函數(shù)中通過判斷改值次哈,篩選被觀察的對象

  • options:設(shè)置通知方式

  • context:傳遞給接受函數(shù)的內(nèi)容,可為nil
    其他沒什么說的吆录,主要說一下options這個參數(shù)窑滞,該參數(shù)接受NSKeyValueObservingOptions類型的枚舉,總共有一下四個類型:

  • NSKeyValueObservingOptionNew //在接收器chagne參數(shù)中傳遞被修改后的新值

  • NSKeyValueObservingOptionOld //在接收器change參數(shù)中傳遞被修改前的舊值

  • NSKeyValueObservingOptionInitial //在注冊觀察者時恢筝,會先向接受者發(fā)送一次消息

  • NSKeyValueObservingOptionPrior //在被觀察對象修改前和修改后哀卫,都向接收器發(fā)送一次消息


了解了注冊觀察者的詳細后,下面我們來對比下注冊觀察者和未注冊觀察的內(nèi)存關(guān)系對比

未注冊的對象

從圖中我們可以看到撬槽,未添加的KVO監(jiān)

聽的對象此改,isa直接指向它的類Person
下面看下注冊了觀察者的對象

可以看到在對象和類中間多了一個NSKVONotifyingPersonClass,該類是由runtime動態(tài)生成侄柔,在我們?nèi)ソo對象sam的age屬性賦值時共啃,setAge方法會調(diào)用Foundation中的_NSSetIntValueAndNotify方法占调,_NSSetIntValueAndNotify方法內(nèi)部會依次調(diào)用

  • willChangeValueForKey

  • super setAge

  • didChangeValueForKey

(如果需要驗證以上調(diào)用順序,我們可以在Person內(nèi)重寫以上方法驗證)

隨后會向接收器發(fā)送消息移剪,也就是我們上面所說的observeValueForKeyPath:ofObject:change:context監(jiān)聽函數(shù)究珊。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挂滓,隨后出現(xiàn)的幾起案子苦银,更是在濱河造成了極大的恐慌,老刑警劉巖赶站,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔虏,死亡現(xiàn)場離奇詭異,居然都是意外死亡贝椿,警方通過查閱死者的電腦和手機痊项,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門伐蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惧浴,“玉大人塞俱,你說我怎么就攤上這事≡埽” “怎么了铺根?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乔宿。 經(jīng)常有香客問我位迂,道長,這世上最難降的妖魔是什么详瑞? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任掂林,我火速辦了婚禮,結(jié)果婚禮上坝橡,老公的妹妹穿的比我還像新娘泻帮。我一直安慰自己,他們只是感情好计寇,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布锣杂。 她就那樣靜靜地躺著,像睡著了一般番宁。 火紅的嫁衣襯著肌膚如雪蹲堂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天贝淤,我揣著相機與錄音,去河邊找鬼政供。 笑死播聪,一個胖子當(dāng)著我的面吹牛朽基,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播离陶,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼稼虎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了招刨?” 一聲冷哼從身側(cè)響起霎俩,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉眶,沒想到半個月后打却,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡谎倔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年柳击,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片片习。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌肴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藕咏,到底是詐尸還是另有隱情状知,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布孽查,位于F島的核電站饥悴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卦碾。R本人自食惡果不足惜铺坞,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洲胖。 院中可真熱鬧济榨,春花似錦、人聲如沸绿映。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉弦。三九已至丐一,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淹冰,已是汗流浹背库车。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留樱拴,地道東北人柠衍。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓洋满,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珍坊。 傳聞我的和親對象是個殘疾皇子牺勾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 上周年級足球聯(lián)賽兒子三場獨進40個球,為五一班爭得冠軍阵漏。今天升旗儀式上頒發(fā)獎品驻民,兒子一人獲得了三個獎項:最佳球員,...
    a馬鳳梅閱讀 122評論 0 0
  • 關(guān)注手繪 我們的故事就開始了 注:圖片來源于網(wǎng)絡(luò)。 手繪 其實在讀大學(xué)的時候早已經(jīng)接觸 大學(xué)的時候也有過手繪課程 ...
    一個空間設(shè)計工作室閱讀 248評論 0 1
  • 風(fēng)兒追隨著沙虑乖, 河流追隨著落花懦趋, 春天追隨著陽光, 我疹味,只想追隨著你…… 我千里單騎仅叫, 手捧鮮花。 追隨著你的腳印...
    春天里的陽光閱讀 243評論 1 2
  • “琴琴,你聽媽媽一句話洪灯,媽媽還能害你嗎坎缭?要是你有別的更好的選擇,媽媽也不勸你签钩,你好好想想掏呼。” 掛掉電話铅檩,琴琴坐在沙...
    小夭精閱讀 287評論 0 0