我正在尝试在Objective-C中创建一个函数,用于监视使用KVO在我的C / C ++代码端声明的指针。有没有办法做到这一点?
详细说明。我有一个C对象指针。我将该指针作为void*
通过我的桥接函数传递到代码的Objective-C端。
是否可以使用传递void*
设置KVO并通过以下方式通知:
-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...
当C对象指针被代码的C端修改时?
答案 0 :(得分:0)
KVO能够只观察一个属性并在每次更改时自动收到通知,这看起来很神奇,但实际上它只是Apple自动更改了你的属性的设置者:
- (void)setFoo:(Foo *)newFoo {
self.foo = newFoo;
}
进入这个:
- (void)setFoo:(Foo *)newFoo {
[self willChangeValueForKey:@"foo"];
self.foo = newFoo;
[self didChangeValueForKey:@"foo"];
}
will
和didChangeValueForKey:
方法是导致KVO系统检查属性的观察者的原因,如果有,则通知他们。通过利用Objective-C的极其动态特性来自动替换setter,这使得修补方法并在运行时更改它们相对简单(顺便说一句,这就是为什么需要dynamic
关键字在Swift中实现KVO属性)。当然,这些动态特性在C或C ++中不存在。
然后,您需要做的是让您的C代码定义两个回调;一个C代码在更改值之前将调用,另一个将在之后调用。一旦你完成了这个设置,让Objective-C端在你的设置过程中的某个地方注册这些回调,并让回调调用willChangeValueForKey:
和didChangeValueForKey:
方法。完成此操作后,您应该能够使用正常的KVO方法观察属性。