isKindOfClass:(Class)aClass
和isMemberOfClass:(Class)aClass
功能有什么区别?
我知道这是一个很小的东西,一个是全局的,而另一个是一个完全的类匹配,但我需要有人指定哪个是哪个。
答案 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: