Objective c 目标C-在运行时确定类类型
在界面中,我有以下内容:Objective c 目标C-在运行时确定类类型,objective-c,class,runtime,Objective C,Class,Runtime,在界面中,我有以下内容: Animal* myPet; 在运行时,我可能希望我的宠物是猫或狗,它们是动物的子类: id newPet; if(someCondition) { newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil]; } else { newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:ni
Animal* myPet;
在运行时,我可能希望我的宠物是猫或狗,它们是动物的子类:
id newPet;
if(someCondition) {
newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil];
} else {
newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:nil];
}
self.myPet = newPet;
显然这是不正确的,但我希望这足以表明我正在努力做什么。做这件事的最佳实践是什么?
是类的
是你的朋友:
[newPet isKindOfClass:Dog.class] == NO
不清楚您想要的是什么,但是如果您想创建一个以字符串命名的类的实例,应该这样做。强烈键入
newPet
asAnimal*
而不是id
id
可以保存对任何类实例的引用,但属性不能与之一起使用(dot语法要求强类型左值)。由于Cat
和Dog
都继承自Animal
,因此这是完全正确和有效的
如果您使用的两个类不共享一个共同的祖先(过去的
NSObject
),那么您应该后退一步,重新思考您的设计——为什么这两个类的实例需要占用同一个变量?对于来自Google的任何人,基于标题:“在运行时确定类类型”,以下是一些有用的知识:
您可以在运行时调用NSObject*
上的方法,以获取对其类的引用
[myObject class];
我们也来看看这些方法:
- -检查对象是否属于其层次结构中的某个类
- -检查对象是否属于特定类
[newPet iskindof class:Dog.class]==NO
)。你为什么说这是错误的?请注意,在你的代码中执行大量的有点像类:
,这通常是一种迹象,表明你在以艰难的方式做事。@Dave-因为它不起作用。如果我尝试newPet.hunger=50,我会得到一个错误:“newPet”中的成员“hunger”请求,它是非类类型“objc_object*”@bbum-我在上面的代码中没有使用isKindOfClass。你愿意分享“简易方法”吗?一般来说,那就是Animal*newPet代码>和myPet
将被宣布为动物*
。除此之外--不--你做得对,我只是警告你未来的道路。。。
[myObject class];