看到您的修改后进行更新:
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 = ...
最后,请确保通过http://bugreporter.apple.com向Apple提交错误。包括一个简单的测试应用程序,以使您很清楚自己在做什么。他们欢迎此类错误报告,即使它们是过去提交的,也可以帮助他们确定修复的优先级。
最后一点:这可能是发生的,因为从理论上讲,您可以选择实现与NSObject完全分开的根对象,在这种情况下,它不会响应-respondsToSelector:
。 -[NSObject respondsToSelector:]
实际上是在NSObject
协议中声明,而不是在类定义中声明。该NSObject
协议实际上是您所知道的大多数NSObject
实际生活的地方。有人可能会争辩+respondsToSelector:
说它也应该在那里,但是到目前为止,还没有。而且,由于您已经提供了协议列表,并且该方法不在其中,因此它会向您发出警告,以确保您知道自己在做什么。