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

sol*_*sol 5 runtime class objective-c

在界面中我有这个:

Animal*     myPet;
Run Code Online (Sandbox Code Playgroud)

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

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

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

jsa*_*eew 9

isKindOfClass 是你的朋友:

[newPet isKindOfClass:Dog.class] == NO
Run Code Online (Sandbox Code Playgroud)


Jon*_*pan 8

强类型newPet作为Animal *代替id.id可以容纳任何类的实例的引用,但性能不能用它来使用(点语法需要一个强类型的左值.)由于两个CatDog继承Animal,这将是完全正确和有效的.

如果您使用的是两个共享共同祖先(过去NSObject)的类,那么您应该退后一步并重新考虑您的设计 - 为什么这两个类的实例需要占用相同的变量?