iOS的区别是isKindOfClass和isMemberOfClass

Noo*_*ath 147 class objective-c hierarchy ios swift

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

Seb*_*lis 257

isKindOfClass: 如果接收者是指定类的实例或从指定类继承的任何类的实例,则返回YES.

YES 如果接收者是指定类的实例,则返回YES.

大多数情况下,您希望使用它isMemberOfClass:来确保您的代码也适用于子类.

NSObject的协议参考说话,稍微介绍一下这些方法.


jtb*_*des 80

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

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 48

假设

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];
Run Code Online (Sandbox Code Playgroud)

然后

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
Run Code Online (Sandbox Code Playgroud)

基本上,-isMemberOfClass:如果实例完全是指定的类,则为-isKindOfClass:true;如果实例完全是指定的类,或者实例的其中一个祖先属于指定的类,则为true.

-isMemberOfClass: 很少使用.

  • 但是,如果您有一个包含 UIView 和 UISegmentedControl 的子视图数组,并且您循环遍历它们并在类上设置条件,则需要使用 isMemberOfClas UIView 和 isMemberOfClass UISegmentedControl 来区分它们,不是吗?isKindOfClass 会将 UISegmentedControl 视为 UIView。 (2认同)

Ale*_*nte 9

isKindOfClass:返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例.

isMemberOfClass:返回一个布尔值,指示接收者是否是给定类的实例.