Может ли категория одновременно реализовывать протокол?

Если категория I 'm создание для класса добавляет методы, которые также выполняют контракт, установленный протоколом, яЯ хотел бы отметить этот класс категории как реализующий протокол, и тем самым указать препроцессору Obj-C, что этот класс также эффективно реализует протокол.

Пример делегата (для наглядности спасибо Оле!):

@protocol SomeDelegate 
  - (void)someDelegateMessage;
@end

Пример категории:

@interface NSObject (SomeCategory) 
  - (void)someDelegateMessage;    
@end

И с другой типичной реализацией

@implement NSObject (SomeCategory)
  - (void)someDelegateMessage {}
@end

Когда я на самом деле пытаюсь это сделать, я получаю предупреждение для каждого метода NSObject:

предупреждение: неполная реализация категории 'SomeCategory»

предупреждение: определение метода для '-описание' не найдено

...

предупреждение: определение метода для '-равно:' не найдено

предупреждение: категория 'SomeCategory» не в полной мере реализоватьNSObject» протокол

Работает нормально, если я удалю из декларации, но, конечно, NSObject нет признан в качестве SomeDelegate

Ответы на вопрос(3)

NSObject> сообщения (и важно, что вы помните, что это имя протокола, а не имя класса), а затем просто используйте 'Я бы' переменные, а неЯ бы' так как это вы явно говорите компиляторуЭто объект, который реализует только протокол SomeDelegate ".

В качестве альтернативы используйте вместо этого NSObject в качестве типа переменной.

Решение Вопроса

зовать метод в другой категории, например:

@interface NSObject (SomeCategory) <somedelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end
</somedelegate>

Если вы сделаете это,NSObject будет считаться соответствующим во время компиляции и проверки во время выполнения дляsomeDelegateMessage преуспеет. Тем не мение,conformsToProtocol: проверки во время выполнения не пройдут.

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

 Justin Searls06 нояб. 2009 г., 01:13
Случайно назвав реализацию категории, что-то еще выглядело так, как изначально выглядела кодовая база - именно ее исправление вызвало мою проблему и ускорило этот вопрос. Изменение этого сделало мою жизнь легче; в то время как я вижу аргумент, что это ошибка, я рассматриваю это как обходной путь к довольно сомнительному поведению по умолчанию. (К счастью, в моем случае это неДля любых пользователей моей библиотеки не имеет смысла вызывать conformsToProtocol :)

Любой шанс, что ваша декларация протокола включаетNSObject протокол? Как это:

@protocol SomeDelegate <nsobject>
...
</nsobject>

Тот'Откуда приходят предупреждения, потому что теперь в вашей категории не реализован полный протокол. В тестовом коде я просто набрал, удаливNSObject из протокола удаляет предупреждения компилятора.

 Brad Cupit14 февр. 2011 г., 23:57
вместо определения iVars / properties / localals с помощьюid использованиеNSObject, Объедините это с Олеответ на удаление <NSObject> из вашего определения протокола, и вы можете иметь свой торт и есть его тоже.
 Justin Searls01 нояб. 2009 г., 01:22
Да, этокак ямы объявилиSomeDelegate, Но удаление из него - при удалении предупреждений о NSObject (SomeCategory) - будут добавляться новые предупреждения каждый раз, когда делегат (какid) отправлено сообщение NSObject. Я должен представить тамЧто-то еще, что я могу сделать, чтобы получить свой пирог и съесть его здесь.
 Ole Begemann01 нояб. 2009 г., 01:45
Я не могу думать ни о чем другом, извини.
 AlBlue01 нояб. 2009 г., 18:05
Согласитесь с Луи - избавьтесь от определения протокола NSObject, вы неэто не нужно Любой переменной id может быть отправлено любое сообщение, а не только NSObject.
 Ole Begemann01 нояб. 2009 г., 18:46
Да, простоid переменные не вызывают предупреждений, но если вы объявитеid delegate (что хотел бы сделать Джастин), любое сообщение NSObject, отправленноеdelegate вызовет предупреждение, если протокол не объявлен@protocol SomeDelegate , Словить 22.
 Louis Gerbarg01 нояб. 2009 г., 07:10
Нет, это победилоВызывать новые предупреждения. Я бы's принимает все сообщения без предупреждения, это их функция. Увидетьunixjunkie.blogspot.com/2008/03/id-vs-nsobject-vs-id.html для объяснения

Ваш ответ на вопрос