2013-04-10 1 views
3

Это наиболее легко объясняется кратким примером. Скажем, у меня есть следующие определения протокола и класса:Как тестировать класс Objective-C, чтобы определить, реагирует ли он на статический селектор (метод класса)?

@protocol ProtocolA <NSObject> 
@optional 
+ (BOOL)methodA; 
@end 

@interface ClassA : NSObject <ProtocolA> 
@end 

ClassA может или не может определить methodA. Если я работал с экземпляром ClassA и методом экземпляра, я мог бы протестировать экземпляр с помощью respondsToSelector:. В этой ситуации, однако, я не могу придумать какой-либо чистый способ определить, определяет ли ClassA (отвечает) methodA.

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

Class <ProtocolA> classRef = [ClassA class]; 

if([classRef respondsToSelector:@selector(methodA)]) {} 

Приведенный выше код выдает следующее предупреждение: «метод Instance„respondsToSelector:“найден вместо метода класса« respondsToSelector:»

Я только сейчас заметил, что если я явно отливать classRef - (Class), тогда предупреждение уходит. Я все еще нахожу это странным.

ответ

7

[[instance class] respondsToSelector:@selector(methodA)]

Каждый экземпляр класса имеет указатель на это объект класса, который можно получить вызвав class. Этот объект (классы являются объектами Objective C) может быть исследован с помощью respondsToSelector:, как и любой другой объект.

+0

Спасибо. Вы абсолютно правы, но я понял, что мой вопрос не совсем подходит к проблеме, которую я испытываю. Не возражаете ли вы взглянуть и посмотреть, можете ли вы объяснить предупреждение, которое я получаю, что, похоже, не должно быть там? – Mathew

+0

Это кажется мне очень странным, потому что вы объявляете его как линию класса! Это не только вы, я сам пробовал и получал такое же предупреждение. Я обнаружил, что если я сниму на первой строке, предупреждение исчезнет. Интересно, это ошибка компилятора? – Lance

+0

Ну, в конечном счете, несущественно, что я знаю, что он работает и должен работать таким образом. Благодаря! – Mathew

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