iOS下KVO使用過程中的陷阱

面試中被問到KVO下常見的crash原因该抒。轉(zhuǎn)載了一下KVO使用陷阱

鑒于我自己對這塊沒有太多的認(rèn)知。通過博主文章加深理解~。本文意在探究健壯的KVO實現(xiàn)方案相叁。

在初始化方法中加入:
[_tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

執(zhí)行默認(rèn)回調(diào)

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { }

在dealloc中移除

[_tableView removeObserver:self forKeyPath:@"contentOffset" context:nil];

我們普通寫的代碼可能就這樣就完事了遵绰。甚至在dealloc中我們都不會進行removeObserve的操作。

事實上這樣還遠遠不夠增淹。比如我的一個VC中有多個監(jiān)聽的話椿访,這樣肯定是不行的

  • (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context
    {
    if (object == _tableView && [keyPath isEqualToString:@"contentOffset"]) {
    [self doSomethingWhenContentOffsetChanges];
    }
    }

這樣加入判斷則 是哪個造成對象,然后觸發(fā)響應(yīng)虑润。

但是這樣還是不夠的成玫,因為可能當(dāng)前類的父類也響應(yīng)KVO。如果這么搞的話拳喻。KVO會在子類中斷

  • (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context
    {
    if (object == _tableView && [keyPath isEqualToString:@"contentOffset"]) {
    [self doSomethingWhenContentOffsetChanges];
    } else {
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
    }

在else的情況里面響應(yīng)super的KVO.順著響應(yīng)鏈條去尋找哭当。

這樣仍然沒有結(jié)束,潛在的問題是可能出現(xiàn)dealloc中KVO的注銷冗澈。KVO的一種缺陷(其實不能稱為缺陷钦勘,應(yīng)該稱為特性)是,當(dāng)對同一個keypath進行兩次removeObserver時會導(dǎo)致程序crash亚亲,這種情況常常出現(xiàn)在父類有一個kvo彻采,父類在dealloc中remove了一次,子類又remove了一次的情況下捌归。這種情況下context始終為空肛响。 這個時候我們可以在父類在子類中的context 定義不同的名稱。這樣的話惜索,可以進行區(qū)分防止removeObserve發(fā)生2次特笋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巾兆,隨后出現(xiàn)的幾起案子猎物,更是在濱河造成了極大的恐慌,老刑警劉巖臼寄,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霸奕,死亡現(xiàn)場離奇詭異,居然都是意外死亡吉拳,警方通過查閱死者的電腦和手機质帅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來留攒,“玉大人煤惩,你說我怎么就攤上這事×堆” “怎么了魄揉?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拭宁。 經(jīng)常有香客問我洛退,道長瓣俯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任兵怯,我火速辦了婚禮彩匕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媒区。我一直安慰自己驼仪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布袜漩。 她就那樣靜靜地躺著绪爸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宙攻。 梳的紋絲不亂的頭發(fā)上奠货,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音粘优,去河邊找鬼仇味。 笑死,一個胖子當(dāng)著我的面吹牛雹顺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊遍,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼嬉愧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喉前?” 一聲冷哼從身側(cè)響起没酣,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵迂,沒想到半個月后裕便,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡见咒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年偿衰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改览。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡下翎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宝当,到底是詐尸還是另有隱情视事,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布庆揩,位于F島的核電站俐东,受9級特大地震影響跌穗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虏辫,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一蚌吸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乒裆,春花似錦套利、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稿黄,卻和暖如春喊衫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杆怕。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工族购, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陵珍。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓寝杖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親互纯。 傳聞我的和親對象是個殘疾皇子瑟幕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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