iOS的isKindOfClass和isMemberOfClass之间的区别


152

isKindOfClass:(Class)aClassisMemberOfClass:(Class)aClass功能之间有什么区别?我知道这有点小,一个是全局的,另一个是完全匹配的类,但是我需要有人指定哪个是哪个。

在Swift isKind(of aClass: AnyClass)isMember(of aClass: AnyClass)

Answers:


264

isKindOfClass:返回YES接收方指定类的实例还是从指定类继承的任何类的实例。

isMemberOfClass:YES当且仅当接收者指定类的实例时返回。

大多数情况下,您要用来isKindOfClass:确保代码也可用于子类。

NSObject协议参考》进一步讨论了这些方法。


您能消除我下面的疑问吗?如果([lbl.textColor isMemberOfClass:[UIColor class]]){//不是Memeber NSLog(@“ Not Memeber”); }否则{NSLog(@“ Not Memeber”); } if([imgimg.image isMemberOfClass:[UIImage class]]){// Memeber NSLog(@“ Memeber”); }否则{NSLog(@“ Not Memeber”); }
Nikkie 2014年

82
  • isKindOfClass:指示对象是否从给定的类继承
  • isMemberOfClass:指示对象是否给定类的实例

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@Durga,如果此回答您的问题,则应接受。在此处详细了解接受汇率:meta.stackexchange.com/questions/16721/…–
poncha

1
如果对象是给定类的实例,则isKindOfClass也将返回YES。换句话说,isMemberOfClass是isKindOfClass的子集。
踏板车

48

假设

@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:true;如果实例完全属于指定类,或者实例的祖先之一为指定类,则为true。

-isMemberOfClass: 很少使用。


1
但是,如果您有一个包含UIViews和UISegmentedControl的子视图数组,并且遍历了它们并在类上设置了条件,则需要使用isMemberOfClas UIView和isMemberOfClass UISegmentedControl进行区分,不是吗?isKindOfClass会将UISegmentedControl视为UIView。
PruitIgoe

@Pruitlgoe这是真的。您可能使用isKindOfClass:[UIView class]来确保要处理的所有对象都是UIView,但是您需要在某些条件语句中使用isMemberOfClass:[UIView class]和/或isMemberOfClass:[UISegmentedControl class]来指示任何不同的实现。基于其直接实例类的视图的数量
NoodleOfDeath 2014年


2

当对象是该类的实例或从其继承的类的实例时,isKindOfClass->返回YES。

isMemberOfClass:如果对象是该类的实例,则返回YES;如果是,则返回No:从其继承的类的实例。

例子在jtbandes答案中就足够了。


0

由于类集群的原因,isMemberOfClass可以为您提供您可能不会期望的答案。在许多情况下,您最好的选择是-(BOOL)conformsToProtocol:(SEL)aSelector或-(BOOL)conformsToProtocol:(Protocol *)aProtocol。即,最好测试它们是否可以满足您的需求,而不是测试类/子类。

有关NSObject类和协议,请参阅apple doc:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.