iOS 中 KVO (key-value-observing) 的原理,簡單來說就是重寫了被觀察屬性的 set 方法,一般情況下只有通過調(diào)用 set 方法對值進(jìn)行改變才會觸發(fā) KVO,直接訪問實例變量修改值是不會觸發(fā) KVO 的。

監(jiān)聽name屬性.png

監(jiān)聽dataSource變化.png

dataSource是否發(fā)生改變.png
我們最終的目的并不是為了監(jiān)聽dataSource變化,而是dataSource里面的內(nèi)容。
那么,該如何實現(xiàn)對 NSMutableArray 的 KVO 呢?官方為我們提供了這個方法- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
像之前一樣,為可變數(shù)組添加 KVO。在加減元素時,使用這個方法來獲取我們要進(jìn)行操作的可變數(shù)組,便可以像普通的屬性一樣,收到它變化的消息。

正確監(jiān)聽dataSource變化.png
那么為什么mutableArrayValueForKey:這個方法可以監(jiān)聽dataSource內(nèi)部變化呢?mutableArrayValueForKey:默認(rèn)采用的是搜索模式,在NSMutableArray搜索匹配insertObject:atIndex:和removeObjectAtIndex:等能引起容器內(nèi)部Object發(fā)生改變的方法,如果發(fā)現(xiàn)至少一個插入或者刪除方法,就會發(fā)送發(fā)送消息給原始接受者。