7

我在 Objective-c 中看到了很多关于动态类型的讨论。但我还没有看到任何我认为应该是的例子。

假设我有一个通用函数,它应该处理两个对象(一个被分配,另一个被释放)并且调用对象将它自己附加到新分配的对象。两者都继承自 class0

如果您认为它会解释某些内容,请随意解释它!

如果在运行时选择类,我如何处理参数列表(?现在是一个占位符)我如何分配一个直到运行时才定义类的对象?

-(void) juggle:(?*)objclass1:(?*)objclass2{

? temp = [? alloc] init];
objclass1 = temp;
[temp release];

[objclass2.view removefromsuperview];
[self.handle insertsubview:objclass1.view];

}
4

2 回答 2

19

我不知道您那里的代码要做什么,它在语法上无效,并且操纵视图与您的问题无关。无论如何,如果你真的不知道你通常使用“id”的类型,它是类型转换为代码生成的“void *”。它具有假定接收任何消息的特殊属性,因此它不会针对未知消息触发编译器警告。

为了实例化一个类,您只需要为其持有“类”对象。在 Objective C 中,一个类的所有实例都引用一个 Class 对象(遗留运行时中的 isa 指针),它也响应方法。换句话说,在下面的代码中:

NSArray *myObject = [[NSArray alloc] init];

NSArray 实际上是一个对象。所以这将生成等效的代码结果:

Class myClass = [NSArray class];
NSArray *myObject = [[myClass alloc] init];

甚至

Class myClass = NSClassFromString(@"NSArray");
NSArray *myObject = [[myClass alloc] init];

它使用函数 NSClassFromString 进入运行时并找到一个具有您传入的名称的类。

如果使用类 getter,所有对象都会返回它们的类,因此要实例化与现有对象具有相同类的对象,如下所示:

- (void) leakObjectWithSameClassAs:(id)object {
    [[[object class] alloc] init];
}
于 2009-02-26T06:02:49.777 回答
0

这就是我现在拥有的

- (void)flipfromv1tov2:(UIViewController*)v1:(NSString*)nib1:(UIViewController*)v2{

    if(v1 == nil)
    {
        UIViewController *newview = [[[v1 class] alloc] initWithNibName:nib1 bundle:nil];
        v1 = newview;
        [newview release];
    }
    [v2.view removeFromSuperview];
    [self.view insertSubview:v1.view atIndex:0];    
}

我还不能验证它,因为我有一个链接问题......我将此函数添加到我的根控制器,但由于某种原因,我收到一个警告,该函数是隐式声明的。并且构建失败,因为函数调用永远不会链接到任何东西

于 2009-02-26T06:37:53.640 回答