【问题标题】:Generic Type In Objective CObjective C 中的泛型类型
【发布时间】:2011-10-08 03:01:00
【问题描述】:

我有几种类型的 os 根视图控制器,我想一次实例化一个(每个函数调用一次)。我想创建一个属性并将其分配给这个新创建的视图控制器。问题显然是这个属性必须是依赖于它正在实例化的视图控制器的特定类型......

有没有办法创建一个通用指针来克服这个......

【问题讨论】:

    标签: objective-c view uiviewcontroller


    【解决方案1】:

    确实有通用指针类型;是id:

    typedef struct objc_object {
        Class isa;
    } *id;
    

    objc.h 中定义,是runtime 的一部分。您可以将任何对象分配给id 类型的指针:

    id myString = [[NSString alloc] init];
    id myArray = [[NSArray alloc] init];
    id myNumber = [[NSNumber alloc] init];
    

    在 Cocoa 中编程时,也可以使用NSObject * 作为一种通用指针;因为它是主要的根类,几乎每个对象都继承自它。但是,这样做并没有什么好处(实际上,您会开始收到“可能无法响应”编译器警告),而且这并不符合习惯。

    一般来说,最好尽可能具体地键入变量。在这种情况下,由于所有对象都是某种视图控制器,我建议使用UIViewController * 作为变量类型。然后可以将任何继承自UIViewController 的对象分配给该指针,并且您仍然允许编译器进行类型检查。

    【讨论】:

      【解决方案2】:

      这就是 id 在 Objective-C 中的含义,一个无类型的 Objective-C 对象指针。

      id test = [[NSMutableArray alloc] init];
      

      【讨论】:

      • 我不会真正称它为“动态类型”,只是它是代表任何对象的类型。
      • Abizern:实际上,他没有。 “id”可以指代任何对象,包括不是从 NSObject 派生的对象,而是从 NSObject 的其他一些自定义实现或其他派生的对象。它或多或少是 (void*) 的 ObjC 等价物。
      • id 不等同于NSObject*
      • 公平 - 我的白痴已被删除;)
      • 我已经这样做了,但它会导致大量“请求成员......不是结构或联合”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2020-08-06
      相关资源
      最近更新 更多