【问题标题】: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"];
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2015-07-07
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多