Answers:
isKindOfClass:
返回YES
接收方是指定类的实例还是从指定类继承的任何类的实例。
isMemberOfClass:
YES
当且仅当接收者是指定类的实例时返回。
大多数情况下,您要用来isKindOfClass:
确保代码也可用于子类。
《NSObject协议参考》进一步讨论了这些方法。
isKindOfClass:
指示对象是否从给定的类继承isMemberOfClass:
指示对象是否是给定类的实例。[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
假设
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
然后
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
基本上,-isMemberOfClass:
如果实例完全属于指定类,则为-isKindOfClass:
true;如果实例完全属于指定类,或者实例的祖先之一为指定类,则为true。
-isMemberOfClass:
很少使用。
isKindOfClass:返回一个布尔值,该值指示接收方是给定类的实例还是从该类继承的任何类的实例。
isMemberOfClass:返回一个布尔值,该值指示接收方是否是给定类的实例。
由于类集群的原因,isMemberOfClass可以为您提供您可能不会期望的答案。在许多情况下,您最好的选择是-(BOOL)conformsToProtocol:(SEL)aSelector或-(BOOL)conformsToProtocol:(Protocol *)aProtocol。即,最好测试它们是否可以满足您的需求,而不是测试类/子类。
有关NSObject类和协议,请参阅apple doc: