Эквивалент метода класса -respondsToSelector: - PullRequest
66 голосов
/ 16 июля 2009

Есть ли метод класса, эквивалентный -respondsToSelector:?

Что-то вроде +respondsToSelector:?

Причина, по которой я спрашиваю, состоит в том, что, реализуя -respondsToSelector: на уровне класса, я получаю предупреждение компилятора: "found" -respondsToSelector: 'вместо' + responsedsToSelector: 'в протоколе (ах) ". ​​

Код выглядит так:

Class <SomeProtocol> someClass = [someInstance class];

if ([someClass respondsToSelector:@selector(someSelector:)]) {
    someVar = [someClass someSelector:someData];
}

Ответы [ 5 ]

82 голосов
/ 16 июля 2009

Обновление после просмотра вашей правки:

Объект класса отвечает на respondsToSelector: очень хорошо, как вы, вероятно, знаете. В тестовом приложении я могу выполнить оба следующих действия без предупреждений компилятора:

NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);

Однако вы объявили протокол для вашей переменной, поэтому предполагается, что объект класса, на который вы указываете, реализует эти методы. Самым простым решением было бы разыграть someClass как id с целью вызова respondsToSelector:. Несколько более чистым решением было бы объявить свой собственный @protocol, который объявляет +respondsToSelector:(SEL)selector, а затем объявить someClass следующим образом:

Class<SomeProtocol, ClassRespondingToSelector> someClass = ...

Наконец, обязательно отправьте сообщение об ошибке в Apple по адресу http://bugreporter.apple.com. Включите простое тестовое приложение, чтобы было очень ясно, что вы делаете. Они приветствуют такие сообщения об ошибках, даже если они были отправлены в прошлом, поскольку это помогает им расставить приоритеты для исправлений.

Последнее замечание: это, вероятно, происходит потому, что теоретически вы могли бы реализовать корневой объект, полностью отдельный от NSObject, и в этом случае он не будет отвечать на -respondsToSelector:. -[NSObject respondsToSelector:] фактически объявлено в протоколе NSObject, а не в определении класса. Протокол NSObject на самом деле является тем местом, где фактически живет то, что вы знаете как NSObject Можно утверждать, что +respondsToSelector: также должен быть там, но на данный момент это не так. А поскольку вы предоставили список протоколов, а метод там отсутствует, он дает вам предупреждение, чтобы вы знали, что делаете.

9 голосов
/ 16 июля 2009

Ну, метод класса - это просто метод объекта класса, так что вы должны просто сделать это

[MyClass respondsToSelector:@selector(...)]
5 голосов
/ 20 февраля 2013

Вы можете использовать следующие instancesRespondToSelector:, начиная с iOS 2.0, поэтому, где вы можете создать экземпляр класса;

[myInstance respondsToSelector: @selector(...)];

С классом вы можете использовать

[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];

Который будет вести себя как +(BOOL) respondsToSelector

1 голос
/ 16 сентября 2010

Я думаю, что вы спрашивали: можете ли вы спросить класс, отвечает ли он на +someMethod или нет? Другими словами, думая об API Touch для Cocoa, вы захотите:

[ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO
[ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES

Но то, что я написал выше, работает не так, как хотелось бы. respondsToSelector: только о методах экземпляра. (Таким образом, оба вызова вернут NO.) В API-интерфейсе Cocoa нет эквивалента respondsToSelector: для класса.

Однако вы можете позвонить class_getClassMethod. Если результат не NULL, метод класса, о котором вы спрашиваете о , присутствует , и вы можете вызвать его.

0 голосов
/ 28 февраля 2012

В Objective C классы также являются объектами, поэтому вы можете отправлять объектные сообщения. В частности, вы можете попросить -respondsToSelector: класса. Вы не можете отправлять методы уровня класса объектам, не относящимся к классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...