IsKindOfClass 和 isMemberOfClass 之间的 iOS 差异

在 Swift 中,isKind(of aClass: AnyClass)isMember(of aClass: AnyClass)的功能有什么不同?

目标 C 中的原始问题

isKindOfClass:(Class)aClassisMemberOfClass:(Class)aClass函数之间的区别是什么? 我知道这是一些小的东西,比如,一个是全局的,而另一个是精确的类匹配,但我需要有人来指定哪一个是请。

41895 次浏览

如果指定类 或者的接收方 是一个例子是指定类 继承遗产的任何类的实例,则 isKindOfClass:返回 YES

当且仅当指定类的接收方 是一个例子时,isMemberOfClass:返回 YES

大多数情况下,您希望使用 isKindOfClass:来确保您的代码也可以与子类一起工作。

NSObject 协议引用对这些方法进行了更多的介绍。

假设

@interface A : NSObject
@end


@interface B : A
@end


...


id b = [[B alloc] init];

那么

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

基本上,如果实例正好属于指定的类,则 -isMemberOfClass:为 true; 如果实例正好属于指定的类,或者如果实例的祖先之一属于指定的类,则 -isKindOfClass:为 true。

-isMemberOfClass:很少使用。

  • isKindOfClass:指示来自给定类的对象 继承遗产是否
  • isMemberOfClass:表示对象 是... 的一个例子是否为给定的类。

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

IsKindOfClass : 返回一个布尔值,该值指示 接收方是给定类的实例或任何类的实例 从该类继承的。

IsMemberOfClass : 返回一个布尔值,该值指示 接收方是给定类的实例。

IsKindOfClass-> 当对象是从它继承的类的实例或类的实例时,返回 YES。

IsMemberOfClass: 当对象是该类的实例时返回 YES,但当从该对象继承的类的实例时返回 No。

例子在 jtband 答案中已经足够好了。

由于类集群的存在,isMemberOfClass 可以为您提供一个可能意想不到的答案。在许多情况下,您的最佳选择更可能是-(BOOL)遵从 ToProtocol: (SEL) aSelector 或-(BOOL)遵从 ToProtocol: (Protocol *) aProtocol。也就是说,如果它们能够满足您的需要,那么最好测试它们,而不是测试 class/subclass。

有关 NSObject 类和协议,请参见 apple doc:

Http://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/reference.html#//apple_ref/occ/cl/nsobject

Http://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/protocols/nsobject_protocol/reference/nsobject.html#//apple_ref/occ/intf/nsobject