使用KVO监视C指针

时间:2017-12-07 05:44:40

标签: c++ objective-c pointers key-value-observing

我正在尝试在Objective-C中创建一个函数,用于监视使用KVO在我的C / C ++代码端声明的指针。有没有办法做到这一点?

详细说明。我有一个C对象指针。我将该指针作为void*通过我的桥接函数传递到代码的Objective-C端。

是否可以使用传递void*设置KVO并通过以下方式通知:

-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...

当C对象指针被代码的C端修改时?

1 个答案:

答案 0 :(得分:0)

KVO能够只观察一个属性并在每次更改时自动收到通知,这看起来很神奇,但实际上它只是Apple自动更改了你的属性的设置者:

- (void)setFoo:(Foo *)newFoo {
    self.foo = newFoo;
}

进入这个:

- (void)setFoo:(Foo *)newFoo {
    [self willChangeValueForKey:@"foo"];
    self.foo = newFoo;
    [self didChangeValueForKey:@"foo"];
}

willdidChangeValueForKey:方法是导致KVO系统检查属性的观察者的原因,如果有,则通知他们。通过利用Objective-C的极其动态特性来自动替换setter,这使得修补方法并在运行时更改它们相对简单(顺便说一句,这就是为什么需要dynamic关键字在Swift中实现KVO属性)。当然,这些动态特性在C或C ++中不存在。

然后,您需要做的是让您的C代码定义两个回调;一个C代码在更改值之前将调用,另一个将在之后调用。一旦你完成了这个设置,让Objective-C端在你的设置过程中的某个地方注册这些回调,并让回调调用willChangeValueForKey:didChangeValueForKey:方法。完成此操作后,您应该能够使用正常的KVO方法观察属性。