警告:MyClass:NSObject没有实现键值观察?怎么可能?

时间:2011-01-26 15:38:14

标签: cocoa compiler-warnings key-value-observing

我刚刚恢复了几个月前离开的Cocoa项目的工作。如果你有一段时间没有使用它,可可是一种奇怪的野兽。

无论如何,在某些时候编译器开始丢弃警告:

  

“MyClass”类的不完整实施   '-addObserver:forKeyPath:options:context'的方法定义未找到
  '-removeObserver:forKeyPath:'的方法定义未找到
  类'MyClass'没有完全实现'MyZoomScrollViewDataSource'协议

MyClass源自NSObject,实际上实现了-addObserver:forKeyPath:-removeObserver:forKeyPath:context:

协议如下:

@protocol MyZoomScrollViewDataSource
    // The range of Data that should be shown. This corresponds to the horizontal  
    //   zoom and the scroll value of self.
    @property FRange selectionRange;

    // Also, make sure the dataSource is KVO compliant
    - (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
    - (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath;
@end

该课程如下:

@interface MyClass : NSObject <MyZoomScrollViewDataSource> {
    IBOutlet Outlets...
    variables...
}
@properties...
(IBAction)actions...
- methods...
@end

我猜我的Cocoa技能非常需要刷新。但是,这些方法仍应继承NSObject,那么MyClass如何才能实现这些方法?

4 个答案:

答案 0 :(得分:3)

答案就在于问题!

编译器警告:

-addObserver:forKeyPath:
-removeObserver:forKeyPath:options:context:

协议:

-addObserver:forKeyPath:options:context:
-removeObserver:forKeyPath:

第二种看起来更好。

答案 1 :(得分:2)

您应该可以使用-Wno-protocol编译器选项来避免这些警告:

  

如果声明一个类实现协议,则会为协议中未由该类实现的每个方法发出警告。默认行为是对未在类中显式实现的每个方法发出警告,即使从超类继承了方法实现。如果使用-Wno-protocol选项,则继承方法从超类中被认为是实现的,并且没有为它们发出警告。

答案 2 :(得分:1)

一种可能的解决方案是将这些函数显式添加到类中。这对我来说似乎相当骇人听闻。如果有的话,我很乐意用更干净的方法来做这件事。

@implementation MyClass

- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context {
    [super addObserver:anObserver forKeyPath:keyPath options:options context:context];
}

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath {
    [super removeObserver:anObserver forKeyPath:keyPath];
}

@end

最奇怪的是:这不仅适用于super,也适用于self!想想我的思绪。到底是什么?

答案 3 :(得分:0)

其实我的答案很仓促。

为什么要在协议中声明KVO方法。 NSObject已经实现了它们的基本版本?