使用KVO监视C指针

问题描述 投票:0回答:1

我试图在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个回答
0
投票

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

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

进入这个:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.