使用NSMutableArray时出现问题

时间:2011-10-18 19:06:50

标签: objective-c cocoa nsmutablearray

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

#import <Foundation/Foundation.h>

@interface MyCustomObject : NSMutableArray
{ 
}

@end

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

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

但xcode在此行发出警告: 不兼容的指针类型,使用类型为“NSMutableArray *”的表达式初始化“MyCustomObject *”

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

6 个答案:

答案 0 :(得分:3)

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

所以,你想要:

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

我认为你已经倒退了。 MyCustomObject是NSMutableArray,但NSMutableArray不是MyCustomObject。如果变量myObj需要能够同时包含NSMutableArrays和MyCustomObjects,那么它应该是一个NSMutableArray。

答案 3 :(得分:2)

应该是:

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

如果你这样做:

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

它将创建一个MyCustomObject的istance,但你将有一个NSMutableArray指针,所以你的新实例将被视为NSMutableArray。

在这种情况下:

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

这是一个错误。在Prevows中,MyCustomObject可以被视为一个简单的NSMutableArray。但NSMutableArray永远不能被视为MyCustomObject。它是一个简单的继承属性。

也许这可以帮助

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

答案 4 :(得分:2)

您应该将对象实例化为:

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

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

答案 5 :(得分:0)

尝试分配MyCustomObject代替:

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