Objective C - 在运行时确定类类型

时间:2011-01-06 23:38:52

标签: objective-c class runtime

在界面中我有这个:

Animal*     myPet;

在运行时我可能希望myPet是一只猫或一只狗,它们是Animal的子类:

    id newPet;
    if(someCondition) {
            newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil];
    } else {
            newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:nil];
    }
    self.myPet = newPet;

显然这是不正确的,但我希望它足以显示我正在尝试做的事情。这样做的最佳做法是什么?

4 个答案:

答案 0 :(得分:9)

isKindOfClass是你的朋友:

[newPet isKindOfClass:Dog.class] == NO

答案 1 :(得分:8)

强调newPetAnimal *而不是idid可以保存对任何类的实例的引用,但属性不能与它一起使用(点语法需要强类型左值。)因为CatDog都继承自{ {1}},这将是完全正确和有效的。

如果您使用的两个类共享一个共同的祖先(过去Animal),那么您应该退后一步并重新考虑您的设计 - 为什么会出现这种情况那两个类需要占用相同的变量吗?

答案 2 :(得分:3)

NSString *className = @"Cat";
Animal *myPet = [[NSClassFromString(className) alloc] init];

目前还不清楚你的目标是什么,但是如果你想创建一个由字符串命名的类的实例,那就应该这样做。

答案 3 :(得分:2)

对于根据标题来自谷歌的任何人:“在运行时确定类类型”,这里有一些有用的知识:

您可以在运行时在NSObject*上调用class方法来获取对其类的引用。

[myObject class];

看看这些方法: