我创建了一个NSMutableArray类型的对象
#import <Foundation/Foundation.h>
@interface MyCustomObject : NSMutableArray
{
}
@end
在我的一个课程中,我看了一个实例:
MyCustomObject *myObj = [[NSMutableArray alloc] init];
但xcode在此行发出警告: 不兼容的指针类型,使用类型为“NSMutableArray *”的表达式初始化“MyCustomObject *”
知道出了什么问题吗?它工作正常,但只是想知道为什么它会发出警告以及如何解决它?
答案 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];