繁体   English   中英

iOS自定义NSObject转换

[英]ios custom NSObject casting

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

谢谢

这取决于您要完成的工作。 如果人员数组中的对象是人员的直接实例,则您不能将它们强制转换为人员的任何子类,因为它们不是该类型的对象。 如果这种情况是正确的,并且您尝试将Human转换为Male,那么您将需要在Male类中创建一个init方法,该方法可以使用提供的Human来初始化新对象:

Male *male = [[Male alloc] initWithHuman: human];

使用这种方法,您的initWithHuman方法要么需要保留传入的Human实例并引用其值,要么复制任何必要的数据。 可以将后面的方法添加到Human类本身,这将允许您使用initWithHuman方法初始化任何子类(实质上是创建基本的复制函数)。

如果humans数组包含Human的子类,则可以将它们强制转换为正确的实例,但是,应首先检查它们是否为该实例。 这是一个例子:

for (Human *human in humans) {
    if ([human isKindOfClass:[Male class]]) {
        Male *male = (Male *) human;
    }
}

您不需要强制转换id类型的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM