iOS isKindOfClass 和 isMemberOfClass 的区别
Posted
技术标签:
【中文标题】iOS isKindOfClass 和 isMemberOfClass 的区别【英文标题】:iOS difference between isKindOfClass and isMemberOfClass 【发布时间】:2011-04-08 21:50:46 【问题描述】:isKindOfClass:(Class)aClass
和 isMemberOfClass:(Class)aClass
函数有什么区别?
我知道这有点像,一个是全局的,而另一个是精确的类匹配,但我需要有人指定哪个是哪个。
在 Swift 中 isKind(of aClass: AnyClass)
和 isMember(of aClass: AnyClass)
。
【问题讨论】:
【参考方案1】:isKindOfClass:
返回 YES
如果接收者是指定类的实例或是任何继承的类的实例指定的类。
isMemberOfClass:
返回 YES
当且仅当接收者是指定类的实例。
大多数时候您希望使用isKindOfClass:
来确保您的代码也适用于子类。
NSObject Protocol Reference 详细介绍了这些方法。
【讨论】:
你能解决我下面的疑问吗? if ([lbl.textColor isMemberOfClass:[UIColor class]]) // 不是成员 NSLog(@"Not Memeber"); else NSLog(@"Not Memeber"); if ([imgView.image isMemberOfClass:[UIImage class]]) // Memeber NSLog(@"Memeber"); else NSLog(@"Not Memeber"); 【参考方案2】:由于类集群,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
【讨论】:
【参考方案3】:isKindOfClass-> 当对象是该类的实例或继承自它的类的实例时返回 YES。
isMemberOfClass:当对象是该类的实例时返回 YES,但如果是从它继承的类的实例,则返回否。
jtbandes 回答中的例子已经足够好了。
【讨论】:
【参考方案4】:isKindOfClass:返回一个布尔值,表示是否 接收者是给定类的实例或任何类的实例 继承自该类。
isMemberOfClass:返回一个布尔值,表示是否 接收者是给定类的一个实例。
【讨论】:
【参考方案5】:isKindOfClass:
表示对象是否继承来自给定的类
isMemberOfClass:
指示对象是否是给定类的实例。
[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
【讨论】:
@Durga,如果这回答了你的问题,你应该接受它。在此处阅读有关接受率的更多信息:meta.stackexchange.com/questions/16721/… 如果对象是给定类的实例,isKindOfClass 也将返回 YES。换句话说,isMemberOfClass 是 isKindOfClass 的一个子集。【参考方案6】:假设
@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。 @Pruitlgoe 这是非常正确的。您可以使用 isKindOfClass:[UIView class] 来确保您正在处理的所有对象都是 UIView,但您需要在一些条件语句中使用 isMemberOfClass:[UIView class] 和/或 isMemberOfClass:[UISegmentedControl class] 来指示任何不同的实现基于它们的直接实例类的视图以上是关于iOS isKindOfClass 和 isMemberOfClass 的区别的主要内容,如果未能解决你的问题,请参考以下文章
如何解析数据,如果它是Objective c中的`isKindOfClass([NSString] class)`
🔥isKindOfClass 和 isMemberOfClass
isKindOfClass:和isMemberOfClass:-b