iPhone SDK与isKindOfClass和isMemberOfClass之间的区别
任何人可以告诉我isKindOfClass:(Class)aClass
和isMemberOfClass:(Class)aClass
函数之间的区别是什么? 我知道这是一个小的喜欢,一个是全球性的,而另一个是确切的类比赛,但我需要有人指定哪个是请。
isKindOfClass:
如果接收者是指定类的实例或从指定类inheritance的任何类的实例,则返回YES。
isMemberOfClass:
如果接收者是指定类的实例,则返回YES。
大多数情况下,您想要使用isKindOfClass:
确保您的代码也适用于子类。
NSObject协议参考对这些方法进行了一些讨论。
-
isKindOfClass:
指示对象是否从给定的类inheritance -
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;
基本上,如果实例与指定的类完全相同,则-isKindOfClass:
为true;如果实例正好是指定的类,或者实例的祖先之一是指定的类,则-isKindOfClass:
为true。
-isMemberOfClass:
很less使用。
isKindOfClass :返回一个布尔值,该值指示接收方是给定类的实例还是从该类inheritance的任何类的实例。
isMemberOfClass :返回一个布尔值,指示接收者是否是给定类的实例。
isKindOfClass->当对象是该类的实例或从其inheritance的类的实例时返回YES。
isMemberOfClass:当对象是那个类的实例时返回YES,但是如果是:从它inheritance的类的实例。
jtbandes答案中的例子已经足够好了。
由于类集群,isMemberOfClass可以给你一个你可能不会期望的答案。 (BOOL)conformsToProtocol:(SEL)aSelector或 – (BOOL)conformsToProtocol:(Protocol *)aProtocol在很多情况下,您的最佳select更可能是 – 也就是说,如果能够回答你的需求,而不是testing类/子类,那么testing这些代码会更好。
请参阅apple doc for NSObject类和协议: