如果我有一个名为Human的自定义NSObject,它有一个名为Male的子类,我有一个名为human的数组,其中包含Human对象。当迭代人类阵列时,我可以投射对象,如:
for (Human *human in humans) {
Male *male = (Male *)human;
}
或者为initWithMale创建方法更好,例如
for (Human *human in humans) {
Male *male = [[Male alloc] initWithMale:(Male *)human];
}
从内存管理的角度来看,最好的方法是什么,或者无关紧要?如果是后者,那么我将如何在initWithMale方法中管理它?
由于
答案 0 :(得分:10)
这取决于你想要完成的任务。如果人类数组中的对象是Human的直接实例,那么您不能将它们转换为Human的任何子类,因为它们不属于该类型。如果这种情况是正确的并且您正在尝试将Human转换为Male,那么您将需要在Male类中创建一个init方法,该方法可以使用提供的Human启动一个新对象:
Male *male = [[Male alloc] initWithHuman: human];
使用这种方法,您的initWithHuman方法将需要保留传入的Human实例并引用其值,或复制任何必要的数据。后一种方法可以添加到Human类本身,这将允许您使用initWithHuman方法启动任何子类(实质上,创建一个基本的复制函数)。
如果人类数组包含Human的子类,那么您可以将它们转换为正确的实例,但是,您应该先检查它们是否是该实例。这是一个例子:
for (Human *human in humans) {
if ([human isKindOfClass:[Male class]]) {
Male *male = (Male *) human;
}
}
答案 1 :(得分:0)
您不需要转换id类型的对象。