2012-05-19 7 views
1

Если я определяю подпротокол протоколас дополнительными методами, тогда определите и реализуйте категорию на NSObject, которая объявляет соответствие этому протоколу, я получаю предупреждения о компиляции. Компилятор жалуется, что моя категория NSObject не реализует все методы, объявленные в протоколе NSObject.Категория при реализации протокола NSObject вызывает предупреждения Unimplemented Method

Я не понимаю, почему это так. NSObject класс (в <Foundation/NSObject.h> заявляет, что оно соответствует протоколу NSObject (и, избыточно, что он реализует эти методы?) - не следует, что хватит

Что является причиной проблемы здесь

Пример кода? - если вы собираете это, вы увидите предупреждение о NSObject (CategoryToImplementMyProtocol) реализации:

@protocol MyProtocol <NSObject> 
- (void)myMethod; 
@end 

@interface NSObject (CategoryToImplementMyProtocol) <MyProtocol> 
@end 

@implementation NSObject (CategoryToImplementMyProtocol) 

- (void)myMethod 
{ 
    NSLog("A la peanut butter sandwiches!"); 
} 

@end 

Я нашел несколько вопросов, касающихся этого, но все ответы были в «сделать это обходной путь!» разнообразие, не то, что " это является причиной проблемы «разнообразия (или просто просто неправильно, несмотря на то, что он принят ...). Я знаю, что могу обойти это. Я бы очень хотел понять , почему не удается.

ответ

1

Проблема в том, что вы снова объявляете о принятии протокола <NSObject>. Способ работы протоколов в Objective-C (лучше или хуже) заключается в том, что реализация категории должна реализовывать все протоколы, указанные в ее интерфейсе.

Кроме того, согласование протокола является номинальным, а не структурным в Objective-C. То есть, для класса, отвечающего на правильные методы, недостаточно для того, чтобы он принял этот протокол.

Редактировать: Кажется, пример код был изменен, и я предполагаю, что мой ответ не очень актуален больше.

+1

Извините! Было ошибкой при расшифровке кода (если это какое-то утешение, я отредактировал вопрос перед тем, как увидеть ваш ответ, хотя я думаю, что это все еще имеет смысл, нет? Поскольку 'MyProtocol' является подпротоколом' NSObject'). –

+0

:) Но я думаю, что этот случай (который я даже не представлял, что произойдет) немного запутаннее, чем тот, на который я ответил. Поскольку такая проблема не возникает при реализации таких категорий в классах, которые наследуют '', но не принимают ее сами. –

+0

Да, я все еще не полностью вижу проблему - почему недостаточно, чтобы основной класс «NSObject», который я добавляю в свою категорию, тоже уже объявляет соответствие протоколу «NSObject»? –

 Смежные вопросы

  • Нет связанных вопросов^_^