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

isKindOfClass:(Class)aClassisMemberOfClass:(Class)aClass 函数有什么区别? 我知道这有点像,一个是全局的,而另一个是精确的类匹配,但我需要有人指定哪个是哪个。

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

【问题讨论】:

    标签: ios objective-c swift class inheritance


    【解决方案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] 来指示任何不同的实现基于它们的直接实例类的视图
          猜你喜欢
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 2013-02-08
          • 2013-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多