iOS的区别是isKindOfClass和isMemberOfClass

时间:2010-09-06 19:38:48

标签: ios objective-c class hierarchy

isKindOfClass:(Class)aClassisMemberOfClass:(Class)aClass功能有什么区别? 我知道这是一个很小的东西,一个是全局的,而另一个是一个完全的类匹配,但我需要有人指定哪个是哪个。

6 个答案:

答案 0 :(得分:256)

如果接收者是指定类的实例或从指定类继承的任何类的实例,则

isKindOfClass:返回YES。

如果接收者是指定类的实例,则

isMemberOfClass:返回YES。

大多数情况下,您希望使用isKindOfClass:来确保您的代码也适用于子类。

NSObject Protocol Reference更多地讨论了这些方法。

答案 1 :(得分:79)

  • isKindOfClass:表示对象是否从给定的类继承
  • isMemberOfClass:表示对象是否是某个给定类的实例。

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

答案 2 :(得分:47)

假设

@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:为真类。

-isMemberOfClass:很少使用。

答案 3 :(得分:9)

  

isKindOfClass :返回一个布尔值,指示是否   receiver是给定类的实例或任何类的实例   继承自该类。

     

isMemberOfClass :返回一个布尔值,指示是否   receiver是给定类的实例。

答案 4 :(得分:2)

isKindOfClass->当对象是该类的实例或从其继承的类的实例时返回YES。

isMemberOfClass:当对象是该类的实例时返回YES但是否则为:从它继承的类的实例。

示例在jtbandes回答中已经足够好了。

答案 5 :(得分:0)

由于类集群,isMemberOfClass可以给你一个你可能没想到的答案。在许多情况下,您最好的选择是 - (BOOL)conformsToProtocol:(SEL)aSelector或 - (BOOL)conformsToProtocol :( Protocol *)aProtocol。即,如果他们能够满足您的需求而不是测试类/子类,那么测试它们会更好。

有关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