【问题标题】:Monitoring C pointer by using KVO使用 KVO 监控 C 指针
【发布时间】:2017-12-07 05:44:40
【问题描述】:
我正在尝试在 Objective-C 中创建一个函数,用于使用 KVO 监视在我的 C/C++ 代码端声明的指针。有没有办法做到这一点?
详细说明。我有一个 C 对象指针。我通过我的桥接函数将该指针作为void* 传递到代码的Objective-C 端。
是否可以使用下传void*来设置KVO并通过:
-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...
C 对象指针何时被 C 端代码修改?
【问题讨论】:
标签:
c++
objective-c
pointers
key-value-observing
【解决方案1】:
KVO 能够仅观察属性并在每次更改时自动获取通知,这看起来很神奇,但实际上它只是 Apple 自动更改您的属性的 setter:
- (void)setFoo:(Foo *)newFoo {
self.foo = newFoo;
}
进入这个:
- (void)setFoo:(Foo *)newFoo {
[self willChangeValueForKey:@"foo"];
self.foo = newFoo;
[self didChangeValueForKey:@"foo"];
}
will 和 didChangeValueForKey: 方法导致 KVO 系统检查属性的观察者,并在有任何观察者时通知他们。 setter 的自动替换是通过利用 Objective-C 极其动态的特性来完成的,这使得修补方法和在运行时更改它们相对简单(顺便说一下,这就是为什么需要 dynamic 关键字来实现Swift 中的 KVO 属性)。当然,这些动态特性在 C 或 C++ 中是不存在的。
那么,您需要做的是让您的 C 代码定义两个回调; C代码将在更改值之前调用一个,然后将调用另一个。设置完成后,让 Objective-C 端在设置过程中的某处注册这些回调,并让回调调用 willChangeValueForKey: 和 didChangeValueForKey: 方法。完成此操作后,您应该能够使用普通的 KVO 方法观察该属性。