iOS isKindOfClass 和 isMemberOfClass 的区别

Posted

技术标签:

【中文标题】iOS isKindOfClass 和 isMemberOfClass 的区别【英文标题】:iOS difference between isKindOfClass and isMemberOfClass 【发布时间】:2011-04-08 21:50:46 【问题描述】:

isKindOfClass:(Class)aClassisMemberOfClass:(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

isKindOfClass和isMemberOfClass

isKindOfClass和isMemberOfClass 的区别

奇怪的`isKindOfClass`行为