为什么 Apple 的 KVO 实现使用子类化而不是 swizzling?

Why does Apple's implementation of KVO use subclassing instead of swizzling?

在 Apple 的 Key-Value Observing Implementation Details document 中,它说实现创建了一个 subclass 来转发 setter 方法。 subclass替换原来的class.

为什么不直接使用 method_exchangeImplementations() 来调整方法?为什么需要创建子class?

因为当您调配一个方法时,您更改了 class 的 所有实例 的方法。 KVO 通知 setter 比非 KVO 通知 setter 更昂贵,因此您只想对实际观察到的实例使用 KVO 通知 setter,而不是对所有实例class.

的实例

KVO 通知 属性 setter 方法必须做什么?至少,它必须使用 [self observationInfo] 检查是否有任何为 属性 注册的 KVO 观察者。所以这是一个有保证的额外消息发送。此外,默认情况下,observationInfo 存储在线程安全的全局哈希 table 中,因此符合 KVO 的 setter 必须获取锁并执行哈希查找——只是为了查看是否有任何 KVO 观察员注册。

如果您调整 属性 setter,那么 class 的每个 实例都必须在 上支付此价格]每次使用setter,即使只有一小部分class实例实际上注册了观察者。

Apple 的 KVO 实现创建了一个 KVO 通知子class。当您在 class 的实例上注册 KVO 观察器时,它会将 那个单个实例 的 class 更改为 KVO 通知子 class .所以只有实际观察到的实例必须使用更昂贵的 KVO 通知 setter.