ios定制NSObject铸造

时间:2011-03-02 17:23:11

标签: iphone objective-c xcode ipad ios

如果我有一个名为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方法中管理它?

由于

2 个答案:

答案 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类型的对象。