在界面中我有这个:
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;
显然这是不正确的,但我希望它足以显示我正在尝试做的事情。这样做的最佳做法是什么?
答案 0 :(得分:9)
isKindOfClass
是你的朋友:
[newPet isKindOfClass:Dog.class] == NO
答案 1 :(得分:8)
强调newPet
为Animal *
而不是id
。 id
可以保存对任何类的实例的引用,但属性不能与它一起使用(点语法需要强类型左值。)因为Cat
和Dog
都继承自{ {1}},这将是完全正确和有效的。
如果您使用的两个类不共享一个共同的祖先(过去Animal
),那么您应该退后一步并重新考虑您的设计 - 为什么会出现这种情况那两个类需要占用相同的变量吗?
答案 2 :(得分:3)
NSString *className = @"Cat";
Animal *myPet = [[NSClassFromString(className) alloc] init];
目前还不清楚你的目标是什么,但是如果你想创建一个由字符串命名的类的实例,那就应该这样做。
答案 3 :(得分:2)
对于根据标题来自谷歌的任何人:“在运行时确定类类型”,这里有一些有用的知识:
您可以在运行时在NSObject*
上调用class
方法来获取对其类的引用。
[myObject class];
看看这些方法:
isKindOfClass:
- 检查对象是否属于其层次结构中任何位置的类。isMemberOfClass:
- 检查对象是否属于特定类。