isKindOfClass和isMemberOfClass之间的iPhone SDK差异
任何人可以告诉我isKindOfClass:(Class)aClass
和isMemberOfClass:(Class)aClass
函数之间的区别是什么? 我知道这是一个小的喜欢,一个是全球性的,而另一个是确切的类比赛,但我需要有人指定哪个是请。isKindOfClass和isMemberOfClass之间的iPhone SDK差异
isKindOfClass:
如果接收方是指定类的实例或从指定类继承的任何类的实例,则返回YES。
isMemberOfClass:
如果接收方是指定类的实例,则返回YES。
大多数情况下,您想使用isKindOfClass:
来确保您的代码也适用于子类。
NSObject Protocol Reference对这些方法进行了一些讨论。
假设
@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:
很少使用。
但是,如果你有一个包含UIViews和UISegmentedControl的子视图数组,并且你通过它们遍历并设置了一个条件类,你将需要使用isMemberOfClas UIView和isMemberOfClass UISegmentedControl来区分它们,不是吗? isKindOfClass会将UISegmentedControl视为UIView。 – PruitIgoe 2013-08-01 18:36:09
@Pruitlgoe这是非常真实的。你可以使用isKindOfClass:[UIView class]来确保你处理的所有对象都是UIViews,但是你需要在一些条件语句中使用isMemberOfClass:[UIView class]和/或isMemberOfClass:[UISegmentedControl class]来指示任何不同的实现根据他们的立即类实例 – 2014-07-02 13:48:38
-
isKindOfClass:
指示对象是否从一个给定的类 -
isMemberOfClass:
继承指示对象是否是一个给定的类的实例。
[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
@Durga,如果这回答你的问题,你应该接受它。阅读更多关于接受率的信息:http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – poncha 2013-01-18 15:25:41
isKindOfClass:返回一个布尔值,它指示 接收机是否是给定的类的一个实例或从该类继承的任何类 的一个实例。
isMemberOfClass:返回一个布尔值,指示 接收方是否是给定类的实例。
isKindOfClass->当对象是该类的实例或从其继承的类的实例时返回YES。
isMemberOfClass:return当对象是该类的实例时返回YES,但如果是:从其继承的类的实例。
这个例子在jtbandes的答案中已经足够了。
由于类集群,isMemberOfClass可以给你一个你可能不会期待的答案。在许多情况下,你的最佳选择更可能是 - (BOOL)conformsToProtocol:(SEL)aSelector或 - (BOOL)conformsToProtocol:(Protocol *)aProtocol。也就是说,如果能够回答你的需求而不是测试类/子类,那么测试它们会更好。
看到苹果文档的NSObject类和协议:
能否请你清楚我下面疑惑?如果([lbl.textColor isMemberOfClass:[UIColor class]]){// Not Memeber NSLog(@“Not Memeber”);其他{ } NSLog(@“Not Memeber”); } if([imgView.image isMemberOfClass:[UIImage class]]){// Memeber NSLog(@“Memeber”);其他{ } NSLog(@“Not Memeber”); } – Nikkie 2014-12-19 14:39:04