iPhone SDK与isKindOfClass和isMemberOfClass之间的区别

任何人可以告诉我isKindOfClass:(Class)aClassisMemberOfClass:(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类和协议:

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