Проблемы с использованием NSMutableArray - PullRequest
2 голосов
/ 18 октября 2011

Я создал объект типа NSMutableArray

#import <Foundation/Foundation.h>

@interface MyCustomObject : NSMutableArray
{ 
}

@end

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

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

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

Есть идеи, что не так?Работает нормально, но просто интересно, почему выдает предупреждение и как его решить?

Ответы [ 6 ]

3 голосов
/ 18 октября 2011

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

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

3 голосов
/ 18 октября 2011

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

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

MyCustomObject *myObj = [[MyCustomObject alloc] init];
2 голосов
/ 18 октября 2011

Вы должны создать экземпляр объекта следующим образом:

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

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

2 голосов
/ 18 октября 2011

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

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

2 голосов
/ 18 октября 2011

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

0 голосов
/ 18 октября 2011

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

MyCustomObject *myObj = [[MyCustomObject alloc] init];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...