gpt4 book ai didi

objective-c - 协议(protocol)对象 : Compiler Warnings on addObserver: 上的键值观察

转载 作者:太空狗 更新时间:2023-10-30 03:26:12 29 4
gpt4 key购买 nike

我有一个带有属性的简单协议(protocol):

@protocol StopsSource <NSObject>
@property (retain,readonly) NSArray * stops;
@end

我在别处添加了一个键值观察器来监听“stops”属性的变化:

id<StopsSource> source = ...
[source addObserver:self
forKeyPath:@"stops"
options:NSKeyValueObservingOptionNew
context:nil];

代码按预期工作,因为当“stops”属性更改时我会收到 observeValueForKeyPath 事件。真正令人烦恼的是 addObserver 调用中的编译器警告:

warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s)

'addObserver' 方法定义在 NSObject 的类别中:

@interface NSObject(NSKeyValueObserverRegistration)

有什么方法可以让 XCode 删除此警告?据我了解,协议(protocol)不能采用类别,所以我不确定如何将 NSKeyValueObserverRegistration 方法引入我的协议(protocol),而不是将声明复制到协议(protocol)本身,这似乎是一种 hack。

我知道这是一个微不足道的问题,因为它只是一个编译器警告,但我很想知道是否有“正确”的方法来解决这个问题。

最佳答案

The real annoyance is a compiler warning on the addObserver call:

warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s)

'addObserver' 方法定义在 NSObject 的类别中:

@interface NSObject(NSKeyValueObserverRegistration)

有什么方法可以让 XCode 删除此警告?

Xcode(小写 c)只是向您显示警告;是 GCC(编译器)首先向您发出警告。

您将 NSObject 与协议(protocol) NSObject 混淆了。 NSObject 类符合 NSObject 协议(protocol)等,但协议(protocol)本身与类没有任何关系。您的 StopsSource 协议(protocol)作为一个协议(protocol),继承自 NSObject 协议(protocol),而不是 NSObject 类。

您的声明只涵盖这两个协议(protocol),而不是任何特定的类,因此它不包含 NSObject 类可能实现的那些协议(protocol)之外的任何内容(例如 KVO)。这就是您收到警告的原因。

正如 Jason Coco 在他对你的问题的评论中告诉你的那样,解决方案是更改声明以使用 NSObject 类加上你的协议(protocol):

NSObject <StopsSource> *source = …;

关于objective-c - 协议(protocol)对象 : Compiler Warnings on addObserver: 上的键值观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741134/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com