2011-01-06 45 views
4

类类型在接口方面我有这样的:目标C - 在运行时确定

Animal*  myPet; 

在运行时,我可能要myPet是一只猫或狗,这是动物的子类:

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

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

+3

为什么这样说错了? – 2011-01-06 23:54:35

+2

请注意,在您的代码中执行大量`isKindOfClass:`通常表示您正在以艰难的方式做事。 – bbum 2011-01-07 00:01:22

回答

8

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

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

9

isKindOfClass是你的朋友:

[newPet isKindOfClass:Dog.class] == NO 
3
NSString *className = @"Cat"; 
Animal *myPet = [[NSClassFromString(className) alloc] init]; 

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

2

对于任何基于标题从谷歌抵达的:“确定在运行时类的类型”,这里有一些有用的东西就知道:

你可以叫上NSObject*class方法在运行时获得一个参考到同级。

[myObject class]; 

在这些方法也看看: