這是怎么實現(xiàn)的呢安岂?其實這都是通過Objective-C強大的運行時(runtime)實現(xiàn)的全陨。當你第一次觀察某個object 時往枣,runtime會創(chuàng)建一個新的繼承原先class的subclass痴突。在這個新的class中摔认,它重寫了所有被觀察的key喧兄,然后將object的isa指針指向新創(chuàng)建的class(這個指針告訴Objective-C運行時某個object到底是哪種類型的object)无畔。所以object神奇地變成了新的子類的實例。
這些被重寫的方法實現(xiàn)了如何通知觀察者們吠冤。當改變一個key時浑彰,會觸發(fā)setKey方法,但這個方法被重寫了拯辙,并且在內部添加了發(fā)送通知機制郭变。(當然也可以不走setXXX方法颜价,比如直接修改iVar,但不推薦這么做)诉濒。
有意思的是:蘋果不希望這個機制暴露在外部周伦。除了setters,這個動態(tài)生成的子類同時也重寫了-class方法未荒,依舊返回原先的class专挪!如果不仔細看的話,被KVO過的object看起來和原先的object沒什么兩樣片排。