【问题标题】:Problems using NSMutableArray使用 NSMutableArray 的问题
【发布时间】:2011-10-20 00:56:39
【问题描述】:

我创建了一个 NSMutableArray 类型的对象

#import <Foundation/Foundation.h>

@interface MyCustomObject : NSMutableArray
{ 
}

@end

在我的一个课程中,我删除了一个实例:

MyCustomObject *myObj = [[NSMutableArray alloc] init];

但是 xcode 在这一行给出警告: 使用“NSMutableArray *”类型的表达式初始化“MyCustomObject *”的不兼容指针类型

知道有什么问题吗?它工作正常,但只是想知道它为什么会发出警告以及如何解决它?

【问题讨论】:

  • xcode 只是一个 IDE,而 Xcode NSMutableArray 描述性不是很好。
  • 您需要考虑将这些答案之一标记为已接受。

标签: objective-c cocoa nsmutablearray


【解决方案1】:

您可以将子类分配给类型为超类的变量,但不能将超类分配给子类变量。

所以,你会想要:

MyCustomObject *myObj = [[MyCustomObject alloc] init];

【讨论】:

    【解决方案2】:

    首先,正如其他人所说,如果你想要你的类的实例,你需要实例化你的类。显然,您不这样做的原因是因为您尝试实例化您的类并且它没有工作。这是更深层次的问题:你不能简单地继承 NSArray 或 NSMutableArray。正如documentation 中所指出的,NSArray 是class cluster,这基本上是一种简短的说法,即“NSArray 实际上并没有实现它的大部分方法”。

    为了继承 NSArray,你必须自己提供它的所有功能。在 NSArray 上创建一个类别或创建一个将数组作为成员的自定义类通常要容易得多。

    【讨论】:

      【解决方案3】:

      我认为你把事情搞反了。 MyCustomObject 是 NSMutableArray,但 NSMutableArray 不是 MyCustomObject。如果你的变量 myObj 需要能够同时保存 NSMutableArrays 和 MyCustomObjects,它应该是一个 NSMutableArray。

      【讨论】:

      • 我所做的只是创建一个命名对象(类)作为一个集合。所以可以说 MyCustomObject 真的是 Cars,我有另一个对象 Car,它具有名称、颜色等实际属性
      • 当然,但是编译器不知道。作为一个类,MyCustomObject 可能具有 NSMutableArray 缺少的字段。如果您有一个指向 MyCustomObject 的指针,但它实际上指向一个 NSMutableArray,那么编译器将允许您触摸不存在的字段。轰隆隆!
      • 在这种情况下,您执行 NSMutableArray *cars = [[NSMutableArray alloc] init];然后将 Car 实例添加到此数组中。
      【解决方案4】:

      您应该将对象实例化为:

      MyCustomObject *myObj = [[MyCustomObject alloc] init];
      

      否则,您所做的只是创建一个 NSMutableArray 并且不需要您的自定义对象(因为它的任何功能都不起作用。)

      【讨论】:

      • 正如我上面所说,当我以这种方式实例化它并执行 addObject 时,它会抛出一个 SIGABT
      • 我的猜测是,我们需要查看更多自定义对象的代码才能了解发生了什么。
      【解决方案5】:

      应该是:

      MyCustomObject *myObj = [[MyCustomObject alloc] init];
      

      如果你这样做:

      NSMutableArray *myObj = [[MyCustomObject alloc] init];
      

      它将创建一个 MyCustomObject 的实例,但您将拥有一个 NSMutableArray 指针,因此您的新实例将被视为一个 NSMutableArray。

      在这种情况下:

      MyCustomObject *myObj = [[NSMutableArray alloc] init];
      

      这是一个错误。在之前的版本中,MyCustomObject 可以看作是一个简单的 NSMutableArray。但是 NSMutableArray 永远不能被视为 MyCustomObject。这是一个简单的继承属性。

      也许这会有所帮助

      http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

      【讨论】:

      • 并且一个类不应该被称为Object
      • 问题是,当我以这种方式初始化它时,当我向它添加一个对象时,我得到了 SIGABT。如果我把它改回 [[NSMutableArray alloc] init] 它工作正常。
      • 其实不叫那个,我只是举个例子……但其实可以叫什么。
      • 你还有更多的字段或方法,还是只是空的?如果是,我假设你想要 NSMutableArray *myObj = [[NSMutableArray alloc] init];忘记 MyCustomObject。
      • 是的,但是我需要在整个应用程序中引用我的自定义对象。在我的 appdelegate 中,我指的是这个对象。让我们称之为汽车
      【解决方案6】:

      尝试分配一个MyCustomObject

      MyCustomObject *myObj = [[MyCustomObject alloc] init];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多