类方法等效于-respondsToSelector:

fir*_*der 67 cocoa cocoa-touch objective-c

是否有类方法相当于-respondsToSelector:

有点像+respondsToSelector:

我问的原因是因为通过-respondsToSelector:在类级别上实现,我得到一个编译器警告:"找到'-respondsToSelector:'而不是'protocol中的'respondsToSelector:'".

代码如下所示:

Class <SomeProtocol> someClass = [someInstance class];

if ([someClass respondsToSelector:@selector(someSelector:)]) {
    someVar = [someClass someSelector:someData];
}
Run Code Online (Sandbox Code Playgroud)

BJ *_*mer 83

看到您的修改后更新:

respondsToSelector:你可能知道,类对象响应很好.在测试应用程序中,我可以在没有任何编译器警告的情况下执行以下两种操作:

NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);
Run Code Online (Sandbox Code Playgroud)

但是,您已在变量上声明了一个协议,因此它假定您指向的类对象实现了这些方法.最简单的解决方案是将其someClass作为id调用目的respondsToSelector:.一个更清洁的解决方案是声明自己的@protocol声明+respondsToSelector:(SEL)selector,然后声明someClass如下:

Class<SomeProtocol, ClassRespondingToSelector> someClass = ...
Run Code Online (Sandbox Code Playgroud)

最后,请务必在http://bugreporter.apple.com上向Apple提交错误.包括一个简单的测试应用程序,以便您清楚地了解自己在做什么.他们欢迎这样的错误报告,即使它们已经过去提交过,因为它可以帮助他们确定修复程序的优先顺序.

最后要注意:这可能正在发生,因为从理论上讲,你可以选择实现一个完全独立于NSObject的根对象,在这种情况下,它不会响应-respondsToSelector:. -[NSObject respondsToSelector:]实际上是在NSObject协议中声明,而不是类定义.该NSObject协议实际上是您所知道的大部分NSObject实际存在的地方.人们可能会争辩说,+respondsToSelector:也应该在那里,但截至目前,情况并非如此.由于您已经提供了协议列表,并且该方法不在其中,因此它会向您发出警告,以确保您知道自己在做什么.

  • 这是删除功能或答案不清楚.`Class`不响应`respondsToSelector:`. (7认同)

new*_*cct 9

类方法只是类对象的一种方法,所以你应该能够做到这一点

[MyClass respondsToSelector:@selector(...)]
Run Code Online (Sandbox Code Playgroud)

  • firstresponder:Objective-C是一种动态语言.如果你将消息发送到`Class`或`id`而没有进一步限定该类型(使用协议),编译器会假定你正在做某种响应选择器或类似的类检查你自己.但是,如果您确实指定了一个协议或(例如)一个特定的类,它会很有用并为您执行检查.由于你声明变量的协议没有`+ respondsToSelector:`声明,编译器会发出警告. (3认同)

Hug*_*ade 5

instancesRespondToSelector:从iOS 2.0开始,您可以使用以下内容,因此您可以使用类的实例;

[myInstance respondsToSelector: @selector(...)];
Run Code Online (Sandbox Code Playgroud)

您可以使用课程

[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];
Run Code Online (Sandbox Code Playgroud)

哪个会表现得像 +(BOOL) respondsToSelector

  • 如果类的实例将响应选择器,而不是类本身将静态响应选择器,则会回答这个问题. (6认同)