158

isKindOfClass:(Class)aClass和函数有什么区别isMemberOfClass:(Class)aClass?我知道这有点像,一个是全局的,而另一个是精确的类匹配,但我需要有人指定哪个是哪个。

在斯威夫特isKind(of aClass: AnyClass)isMember(of aClass: AnyClass).

4

6 回答 6

274

isKindOfClass:YES如果接收者指定类的实例或从指定类继承的任何类的实例,则返回。

isMemberOfClass:YES当且仅当接收者是指定类的实例时返回。

大多数时候,您希望使用它isKindOfClass:来确保您的代码也适用于子类。

NSObject 协议参考更多地讨论了这些方法。

于 2010-09-06T19:43:28.897 回答
84
  • isKindOfClass:指示对象是否继承自给定类
  • isMemberOfClass:指示对象是否是给定类的实例。

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
于 2011-07-27T07:32:35.840 回答
48

认为

@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:很少使用。

于 2010-09-06T19:43:36.510 回答
9

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

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

于 2011-07-27T07:36:22.220 回答
2

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

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

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

于 2011-07-27T07:41:05.680 回答
0

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

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

于 2012-01-10T22:03:01.697 回答