Iphone ios自定义对象转换

Iphone ios自定义对象转换,iphone,objective-c,xcode,ipad,ios,Iphone,Objective C,Xcode,Ipad,Ios,如果我有一个名为Human的自定义NSObject,它有一个名为Male的子类,我有一个名为humans的数组,其中包含Human对象。在迭代humans数组时,我可以强制转换对象,例如: for (Human *human in humans) { Male *male = (Male *)human; } 还是最好创建一个方法来初始化,比如 for (Human *human in humans) { Male *male = [[Male alloc] initWithM

如果我有一个名为Human的自定义NSObject,它有一个名为Male的子类,我有一个名为humans的数组,其中包含Human对象。在迭代humans数组时,我可以强制转换对象,例如:

for (Human *human in humans) {
    Male *male = (Male *)human;
}
还是最好创建一个方法来初始化,比如

for (Human *human in humans) {
    Male *male = [[Male alloc] initWithMale:(Male *)human];
}
从内存管理的角度来看,什么是最好的方法,或者说这无关紧要?如果是后者,那么我将如何在initWithMale方法中管理它


谢谢,这取决于你想完成什么。如果humans数组中的对象是Human的直接实例,则不能将它们强制转换为Human的任何子类,因为它们不属于该类型。如果此场景是正确的,并且您正在尝试将人员转换为男性,那么您将需要在男性类中创建一个init方法,该方法可以使用提供的人员启动一个新对象:

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

您无法将
人类
强制转换为
男性
,除非对象本身是
男性
的实例。感谢boltClock,它们是男性对象,我也有女性对象。human.sex可以是1或0,具体取决于性别。所以我知道它是男性,但这是投射对象的最佳方式吗?Objective-c是弱类型的(至少据我所知),投射是一种很好的方式,但你不需要做什么。它基本上只帮助消除一些编译器警告。所以,是的,我会沿着选角的路线走。