isKindOfClass和isMemberOfClass之间的iOS差异

isKindOfClass和isMemberOfClass之间的iOS差异,ios,objective-c,swift,class,inheritance,Ios,Objective C,Swift,Class,Inheritance,isKindOfClass:(Class)aClass和isMemberOfClass:(Class)aClass函数之间有什么区别? 我知道它很小,一个是全局的,另一个是精确的类匹配,但我需要有人指定哪个是哪个 在SwiftisKind(aClass:AnyClass的)和isMember(aClass:AnyClass的)isKindOfClass:返回YES如果接收者是指定类的实例,或者从指定类继承的任何类的实例 isMemberOfClass:当且仅当接收方是指定类的实例时返回YES 大

isKindOfClass:(Class)aClass
isMemberOfClass:(Class)aClass
函数之间有什么区别? 我知道它很小,一个是全局的,另一个是精确的类匹配,但我需要有人指定哪个是哪个


在Swift
isKind(aClass:AnyClass的)
isMember(aClass:AnyClass的)
isKindOfClass:
返回
YES
如果接收者是指定类的实例,或者从指定类继承的任何类的实例

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

大多数情况下,您希望使用
isKindOfClass:
来确保您的代码也能与子类一起工作

他们会更多地讨论这些方法。

假设

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];
然后

基本上,
-isMemberOfClass:
如果实例恰好属于指定的类,则为true;而
-isKindOfClass:
如果实例恰好属于指定的类,或者如果实例的一个祖先属于指定的类,则为true

-isMemberOfClass:
很少使用

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

:返回一个布尔值,指示 receiver是给定类的实例或任何类的实例 从该类继承的

:返回一个布尔值,指示 receiver是给定类的实例


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

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


在jtbandes答案中,这个例子已经足够好了。

因为类集群,isMemberOfClass可以给你一个你可能没有想到的答案。在许多情况下,您的最佳选择更可能是-(BOOL)conformsToProtocol:(SEL)一个选择器或-(BOOL)conformsToProtocol:(协议*)一个协议。也就是说,如果它们能够满足您的需要,那么最好测试它们,而不是测试类/子类

有关NSObject类和协议,请参见apple文档:


@Durga,如果这回答了你的问题,你应该接受它。阅读更多关于接受率的信息:如果对象是给定类的实例,isKindOfClass也将返回YES。换句话说,isMemberOfClass是isKindOfClass的一个子集。但是,如果您有一个包含UIView和UISegmentedControl的子视图数组,并且循环遍历它们并设置类的条件,则需要使用isMemberOfClass UIView和isMemberOfClass UISegmentedControl来区分它们,不是吗?Iskindof类将UISegmentedControl视为UIView。@PruitGoe这是非常正确的。您可以使用isKindOfClass:[UIView class]来确保您处理的所有对象都是UIView,但您需要使用isMemberOfClass:[UIView class]和/或isMemberOfClass:[UISegmentedControl class]在一些条件语句中,根据视图的直接实例类指示视图的任何不同实现。您能澄清我下面的疑问吗?if([lbl.textColor isMemberOfClass:[UIColor class]]){//Not Memeber NSLog(@“Not Memeber”);}else{NSLog(@“Not Memeber”);}if([imgView.image isMemberOfClass:[UIImage class]]){//Memeber NSLog(@“Not Memeber”);}else{NSLog(@“Not Memeber”);}
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO