2011-10-18 3 views
2

Я создал объект типа NSMutableArrayПроблемы с использованием NSMutableArray

#import <Foundation/Foundation.h> 

@interface MyCustomObject : NSMutableArray 
{ 
} 

@end 

в одном из моих классов, я delcare экземпляр:

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

Но Xcode дает предупреждение на этой линии: Несовместимые типы указателей, инициализирующие «MyCustomObject *» с выражением типа «NSMutableArray»

Любая идея, что не так? Он отлично работает, но просто интересно, почему он бросает предупреждение и как его разрешить?

+0

xcode - это всего лишь IDE, и * Xcode NSMutableArray * не очень описателен. – vikingosegundo

+1

Необходимо принять во внимание один из этих ответов. –

ответ

1

Я думаю, что у вас есть вещи назад. MyCustomObject - это NSMutableArray, но NSMutableArray не является MyCustomObject. Ваша переменная myObj должна быть NSMutableArray, если она должна содержать как NSMutableArrays, так и MyCustomObjects.

+0

Все, что я делаю, это создание именованного объекта (класса) в виде коллекции. MyCustomObject - это действительно автомобили, и у меня есть еще один объект. Автомобиль с реальными свойствами, такими как имя, цвет и т. д. – Jesse

+0

Конечно, но компилятор этого не знает. Как класс, MyCustomObject может иметь поля, которые NSMutableArray не хватает. Если у вас есть указатель на MyCustomObject, но он на самом деле указывает на NSMutableArray, тогда компилятор позволит вам коснуться несуществующего поля. Boom! – ObscureRobot

+0

В этом случае вы делаете NSMutableArray * cars = [[NSMutableArray alloc] init]; а затем добавьте экземпляры Car в этот массив. –

2

Оно должно быть:

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

, если вы:

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

Это создаст istance из MyCustomObject, но вы будете иметь указатель NSMutableArray, так что ваш новый экземпляр будет просто увидеть как NSMutableArray.

В этом случае:

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

Это ошибка. В предыдущих версиях MyCustomObject можно рассматривать как простой NSMutableArray. но NSMutableArray никогда не может рассматриваться как MyCustomObject. Это простое свойство наследования.

Может быть, это может помочь

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

+0

и класс не следует называть Object – vikingosegundo

+0

Дело в том, что когда я инициализирую его таким образом, когда я добавляю к нему объект, я получаю SIGABT. Если я верну его обратно в [[NSMutableArray alloc] init], он отлично работает. – Jesse

+0

На самом деле это не называется, я просто поместил это для примера ... но на самом деле его можно назвать любым. – Jesse

3

Вы можете назначить дочерний класс переменного напечатанные в качестве супер-класса, но вы не можете назначить супер-класс переменного класса ребенка.

Итак, вы хотите:

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

Попробуйте выделение MyCustomObject вместо:

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

Вы должны быть инстанцированием объекта как:

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

В противном случае, всех вы делаете, создаете NSMutableArray и не нуждаетесь в своем настраиваемом объекте (поскольку ни одна из его функций nality будет работать.)

+0

Как я уже говорил выше, когда я создаю экземпляр этого способа и делаю addObject, он бросает SIGABT – Jesse

+0

. Я предполагаю, что нам нужно будет увидеть больше код вашего пользовательского объекта, чтобы увидеть, что происходит. – Brian

2

Во-первых, как и все остальные, вам нужно создать экземпляр вашего класса, если вы хотите получить экземпляр своего класса. Очевидно, причина, по которой вы этого не делаете, заключается в том, что вы пытались создать экземпляр своего класса, и это не сработало. Это более глубокая проблема: вы не можете просто подклассифицировать NSArray или NSMutableArray. Как отмечено в documentation, NSArray является class cluster, что в основном является коротким способом сказать: «NSArray фактически не реализует большинство своих методов."

Чтобы подкласс NSArray, вы по существу должны обеспечить все его функциональные возможности самостоятельно. Это, как правило, гораздо проще, либо создать категорию на NSArray или создать пользовательский класс, который имеет массив в качестве члена.

Смежные вопросы