isKindOfClass:(Class)aClass
和函数有什么区别isMemberOfClass:(Class)aClass
?我知道这有点像,一个是全局的,而另一个是精确的类匹配,但我需要有人指定哪个是哪个。
在斯威夫特isKind(of aClass: AnyClass)
和isMember(of aClass: AnyClass)
.
isKindOfClass:(Class)aClass
和函数有什么区别isMemberOfClass:(Class)aClass
?我知道这有点像,一个是全局的,而另一个是精确的类匹配,但我需要有人指定哪个是哪个。
在斯威夫特isKind(of aClass: AnyClass)
和isMember(of aClass: AnyClass)
.
isKindOfClass:
YES
如果接收者是指定类的实例或从指定类继承的任何类的实例,则返回。
isMemberOfClass:
YES
当且仅当接收者是指定类的实例时返回。
大多数时候,您希望使用它isKindOfClass:
来确保您的代码也适用于子类。
NSObject 协议参考更多地讨论了这些方法。
isKindOfClass:
指示对象是否继承自给定类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;
基本上,-isMemberOfClass:
如果实例完全属于指定类,则为-isKindOfClass:
真,而如果实例恰好属于指定类或实例的祖先之一属于指定类,则为真。
-isMemberOfClass:
很少使用。
isKindOfClass:返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。
isMemberOfClass:返回一个布尔值,指示接收者是否是给定类的实例。
isKindOfClass-> 当对象是该类的实例或继承自它的类的实例时返回 YES。
isMemberOfClass:当对象是该类的实例时返回 YES,但如果是从它继承的类的实例,则返回否。
示例在 jtbandes 答案中已经足够好了。
由于类集群,isMemberOfClass 可以给你一个你可能没想到的答案。在许多情况下,您的最佳选择更有可能是 -(BOOL)conformsToProtocol:(SEL)aSelector 或 -(BOOL)conformsToProtocol:(Protocol*)aProtocol。即,如果它们可以满足您的需要,最好测试它们而不是测试类/子类。
有关 NSObject 类和协议,请参阅苹果文档: