【发布时间】:2023-04-04 13:26:01
【问题描述】:
我在我的 iPhone Objective-C 应用程序中遇到了一些奇怪的行为。
我正在使用一些代码来测试一个对象:
if (!class_conformsToProtocol([someVar someFunctionThatReturnsAClass], @protocol(MyProtocol)))
[NSException raise:@"Invalid Argument" format:@"The variables returned by 'someFunctionThatReturnsAClass' Must conform to the 'myProtocol' protocol in this case."];
奇怪的是,当我有一个看起来像这样的课程时:
@interface BaseClass : NSObject<MyProtocol>
...
@end
@interface SubClass : BaseClass
...
@end
当我调用这个片段时:class_conformsToProtocol([SubClass class], @protocol(MyProtocol)),它返回NO。
此外,此代码失败:
class_conformsToProtocol([NSString class], @protocol(NSObject)); // also returns NO
虽然此代码返回YES:
[NSString conformsToProtocol:@protocol(NSObject)];
我在文档中遗漏了什么吗? 或者这是某种错误? (我在 iOS 4.2 上,如果这很重要的话)。
【问题讨论】:
-
哇,这有趣...
-
不是错误。
class_conformsToProtocol()不检查超类。这是设计使然,因为迭代超类很简单。 -
这和isKindOfClass vs isMemberOfClass之间的区别是一样的。在这种情况下,您正在寻找
conformsToProtocol:方法(您可以调用您获得的类)。 -
我实际上是来这里寻找一种方法来检查子类对协议的一致性——忽略父类的一致性(反之亦然),所以感谢您提出这个问题! :)
-
@ethanB 显然我知道正确的调用方法,就像我的帖子中一样,以及其他所有答案:)
标签: iphone objective-c class protocols