我刚刚恢复了几个月前离开的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
如何才能实现这些方法?
答案 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已经实现了它们的基本版本?