Метод класса эквивалент -respondsToSelector:


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

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

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

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

Class <SomeProtocol> someClass = [someInstance class];

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

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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