【问题标题】:ios custom NSObject castingios 自定义 NSObject 强制转换
【发布时间】:2011-03-02 17:23:11
【问题描述】:

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

谢谢

【问题讨论】:

  • 除非对象本身是 Male 的实例,否则您不能将 Human 转换为 Male
  • 感谢boltClock,它们是男性对象,我也有女性对象。 human.sex 可以是 1 或 0,具体取决于性别。所以我知道它的雄性,但它是投射物体的最佳方式吗?
  • Objective-c 是弱类型的(至少据我所知),强制转换是一件好事,但您无需做任何事情。它基本上只有助于摆脱一些编译器警告。所以是的,我会沿着选角路线走。

标签: iphone objective-c xcode ipad ios


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多