Предупреждение: MyClass: NSObject не реализует наблюдение значения ключа? Как это может быть? - PullRequest
0 голосов
/ 26 января 2011

Я только недавно возобновил работу над проектом Какао, который я оставил несколько месяцев назад. Какао - странный зверь, если вы давно его не используете.

В любом случае, в какой-то момент компилятор начал сбрасывать предупреждения:

Неполная реализация класса '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

Полагаю, мои навыки в Какао нуждаются в обновлении. Но все же эти методы должны быть унаследованы от NSObject, так как же MyClass не может реализовать эти методы?

Ответы [ 4 ]

3 голосов
/ 26 января 2011

Ответ на вопрос!

Предупреждение компилятора:

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

Протокол:

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

Второй выглядит лучше.

2 голосов
/ 27 января 2011

Вы должны быть в состоянии избежать этих предупреждений, используя опцию компилятора -Wno-protocol:

Если класс объявлен для реализации протокола, выдается предупреждение для каждого метода в протоколе, которыйне реализуется классом.Поведение по умолчанию - выдавать предупреждение для каждого метода, явно не реализованного в классе, , даже если реализация метода наследуется от суперкласса. Если вы используете опцию -Wno-protocol, то методы наследуются от суперклассасчитаются выполненными, и за них не выдается предупреждение.

1 голос
/ 27 января 2011

Одним из возможных решений этой проблемы является явное добавление этих функций в класс.Это кажется довольно хакерским для меня.Я бы с удовольствием использовал более чистый способ сделать это, если он есть.

@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!Считай, что мой ум взорван.Какого черта?

0 голосов
/ 26 января 2011

На самом деле я поспешил с ответом.

Почему вы объявляете методы KVO в протоколе. NSObject уже реализует их базовую версию?

...