ios 自定义 NSObject 铸造

发布时间: 2017/3/21 22:55:48
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

如果我有叫人已调用子类的自定义 NSObject 男性和我有被称为人类包含人类对象的数组。当人类数组遍历可以我将对象强制转换如︰

for (Human *human in humans) {
    Male *male = (Male *)human;
}

或者是要创建一种 initWithMale 的方法如

for (Human *human in humans) {
    Male *male = [[Male alloc] initWithMale:(Male *)human];
}

什么会是最好的方法,从内存管理的角度或你不介意吗?如果它是后者,那么我如何将我的 initWithMale 方法管理这吗?

谢谢你

解决方法 1:

它取决于你想完成什么。 如果人类数组中的对象的人直接实例,然后你不能丢给任何子类的人他们并不是该类型。 如果这种情况下是正确并且您正将人类转化为男性,那么您将需要创建一个 init 方法可以启动一个新的对象,使用提供的人权的男性类中︰

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

使用此方法,您的 initWithHuman 方法需要保留传递中的人类实例和引用它的值,或复制任何必要的数据。 以后的方法可以添加到人类的类本身,这将使您可以启动任何子类使用 initWithHuman 方法 (在本质上,创建一个基本复制函数)。

如果人类数组包含子类的人类,然后你可以扔到正确的实例,但是,你应该检查,看看他们是否该实例第一次。 下面是一个示例︰

for (Human *human in humans) {
    if ([human isKindOfClass:[Male class]]) {
        Male *male = (Male *) human;
    }
}
官方微信
官方QQ群
31647020