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:也应该在那里,但截至目前,情况并非如此.由于您已经提供了协议列表,并且该方法不在其中,因此它会向您发出警告,以确保您知道自己在做什么.
类方法只是类对象的一种方法,所以你应该能够做到这一点
[MyClass respondsToSelector:@selector(...)]
Run Code Online (Sandbox Code Playgroud)
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
| 归档时间: |
|
| 查看次数: |
35509 次 |
| 最近记录: |