KVO是通過isa-swizzing的方法來實現的。就是比如B作爲觀察者觀察A的屬性name時,在運行時會動態生成一個A的子類notify_A類,然後將A類的實例對象的isa指針指向notify_A這個子類,然後在子類中重寫的方法有三個:
- name的set方法
- (void) setName:(NSString*) name
{
willChangeValueForKey;
_name = name;
didChangeValueForKey;
}
didChangeValueForKey
方法內部已經調用了observer的observeValueForKeyPath:ofObject:change:context:方法。
- 重寫了class方法,返回的是原來的A類對象,這樣的話內部再調用A類實例變量的其他方法時則不會發生問題。
class
{
return class_getSuperclass(object_getClass(self));
}
- 重寫了delloc方法,在合適的時候銷燬這個運行時創建的類。