【发布时间】:2011-10-08 03:01:00
【问题描述】:
我有几种类型的 os 根视图控制器,我想一次实例化一个(每个函数调用一次)。我想创建一个属性并将其分配给这个新创建的视图控制器。问题显然是这个属性必须是依赖于它正在实例化的视图控制器的特定类型......
有没有办法创建一个通用指针来克服这个......
【问题讨论】:
标签: objective-c view uiviewcontroller
我有几种类型的 os 根视图控制器,我想一次实例化一个(每个函数调用一次)。我想创建一个属性并将其分配给这个新创建的视图控制器。问题显然是这个属性必须是依赖于它正在实例化的视图控制器的特定类型......
有没有办法创建一个通用指针来克服这个......
【问题讨论】:
标签: objective-c view uiviewcontroller
确实有通用指针类型;是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 的对象分配给该指针,并且您仍然允许编译器进行类型检查。
【讨论】:
这就是 id 在 Objective-C 中的含义,一个无类型的 Objective-C 对象指针。
id test = [[NSMutableArray alloc] init];
等
【讨论】:
id 不等同于NSObject*