【问题标题】:Objective C, how to query if an object is of a certain classObjective C,如何查询对象是否属于某个类
【发布时间】:2011-02-05 13:46:51
【问题描述】:

我是从 TableViewCell 派生的。当我查询有关索引路径的表视图时,它返回一个 UITableViewCell。我如何确定这个对象是否是我的自定义类型“CustomCell”之一?

【问题讨论】:

    标签: objective-c derived-class


    【解决方案1】:

    实际上您可以在这里使用两种方法。您可能想要的是isKindOfClass:,但还有另一种方法称为isMemberOfClass:,如果接收者是所提供类的实例,而不是子类的实例,则只会返回YES

    例如,如果DerivedClassBaseClass 的子类,那么每个方法的结果如下:

    BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
    BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO
    

    【讨论】:

      【解决方案2】:

      在面向对象的设计中,尝试使用实例的类标识是一种代码异味,应该引起注意。你到底想用你的自定义单元做什么?也许有人可以提出更好的方法。

      无论如何,依赖接口(Objective-C 中的 @protocol)比依赖类更好,因为它有助于解耦你的设计。使用您需要的相关 API 定义 @protocol 并让您的 CustomCell 实现该协议。然后在您的代码中进行测试:

      if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
        //...
      }
      

      而不是测试类身份。

      如果只需要一个方法,可以使用[cell respondsToSelector:@selector(myMethod)]

      【讨论】:

      • 我认为在这种情况下用例非常清楚。尤其是 ObjectiveC 类型的工作方式。您有一个表格视图,其中填充了UITableViewCell 的各种子类的单元格,并且您要求一个带有[tableView cellForRowAtIndexPath:indexPath] 的单元格。该表格视图方法只承诺返回UITableViewCell 的实例,并且知道您是否有该单元格的子类的唯一方法是测试它的类。您可以创建一个协议,但无论如何您都会将大部分自定义单元方法放入其中,从而使事情变得更加冗长而没有明显的好处。
      【解决方案3】:
      if ([cell isKindOfClass:[CustomCell class]]) {
         // ...
      }
      

      【讨论】:

        【解决方案4】:
        if ([cell isKindOfClass:[CustomCell class]]) {
            [(CustomCell*)cell customCellMethod];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-25
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多