Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C-在运行时确定类类型_Objective C_Class_Runtime - Fatal编程技术网

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
as
Animal*
而不是
id
id
可以保存对任何类实例的引用,但属性不能与之一起使用(dot语法要求强类型左值)。由于
Cat
Dog
都继承自
Animal
,因此这是完全正确和有效的


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

对于来自Google的任何人,基于标题:“在运行时确定类类型”,以下是一些有用的知识:

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

[myObject class];
我们也来看看这些方法:

  • -检查对象是否属于其层次结构中的某个类
  • -检查对象是否属于特定类

我理解它属于类,但我不确定它是否适合我的示例代码。我不是想确定动物是什么种类的,我是想根据某种条件创造不同种类的动物。@sol:你要寻找的“某种条件”正是肯尼发布的(即
[newPet iskindof class:Dog.class]==NO
)。你为什么说这是错误的?请注意,在你的代码中执行大量的
有点像类:
,这通常是一种迹象,表明你在以艰难的方式做事。@Dave-因为它不起作用。如果我尝试newPet.hunger=50,我会得到一个错误:“newPet”中的成员“hunger”请求,它是非类类型“objc_object*”@bbum-我在上面的代码中没有使用isKindOfClass。你愿意分享“简易方法”吗?一般来说,那就是
Animal*newPet
myPet
将被宣布为
动物*
。除此之外--不--你做得对,我只是警告你未来的道路。。。
[myObject class];