Подтвердить что ты не робот

Класс эквивалентен методу -ответчик для выбора:

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

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

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

Код выглядит следующим образом:

Class <SomeProtocol> someClass = [someInstance class];

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

Ответ 1

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

Объект класса отвечает на 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: также должен быть там, но на данный момент это не так. И поскольку вы предоставили список протоколов, а метод там отсутствует, он дает вам предупреждение, чтобы убедиться, что вы знаете, что вы делаете.

Ответ 2

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

[MyClass respondsToSelector:@selector(...)]

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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