Почему мой подкласс NSMutableArray не работает должным образом? - PullRequest
16 голосов
/ 09 мая 2011

У меня есть подкласс NSMutableArray следующим образом:

Базовый класс:

@interface MyBaseMutableArray : NSMutableArray {
    // Database variables
    NSString * databaseName;
    NSString * databasePath;
}

@property (nonatomic, retain) NSString * databasePath;

- (id)initWithContentsOfSQLiteDB:(NSString *)dbTable;
-(void) checkAndCreateDatabase;
-(void) readFromDatabase;

@end

Подкласс:

@interface IngredientsMutableArray : MyBaseMutableArray
{

}

-(void) readFromDatabase;

@end

При создании IngredientsMutableArray я делаю следующее:

IngredientsMutableArray * i  = [[IngredientsMutableArray alloc]
    initWithContentsOfSQLiteDB:@"MyIngredientsDB.sql"];

НО, когда я пытаюсь выполнить [self addObject: ингридиенты], я выкидываю исключение следующим образом:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray count]: method only defined for abstract class.  Define -[IngredientsMutableArray count]!'

Я считаю, что я неправильно инициализирую NSMutableArray.Я собирался к нам initWithCapaciity, но я не знаю счет до вызова SQL.Я думаю, что упускаю из виду нечто очевидное, но, будучи новичком в Objective CI, я немного растерялся.

Любая помощь приветствуется.

Ответы [ 3 ]

25 голосов
/ 09 мая 2011

Согласно документации вам необходимо:

Методы для переопределения

Методы NSMutableArray концептуально основаны на следующих примитивных методах:

insertObject:atIndex:

removeObjectAtIndex:

addObject:

removeLastObject

replaceObjectAtIndex:withObject:

В подклассе вы должны переопределить все эти методы, хотя вы можете реализовать требуемую функциональность, используя только первые два (однако это, вероятно, будет неэффективно).Вы также должны переопределить примитивные методы класса NSArray.

Но ответ real состоит в том, что вы действительно не хотите быть его подклассом.Есть два варианта:

  1. Использовать категорию
  2. Создать новый класс с NSArray в качестве переменной-члена

Я думаю, что 'в этом случае я бы выбрал второй вариант.

В целом вы склонны создавать подклассы системных классов гораздо реже, чем в C # или Java.

4 голосов
/ 09 мая 2011

Вы не хотите создавать подклассы NSArray или NSMutableArray.Это кластер классов.Из документов NSArray :

Любой подкласс NSArray должен переопределять примитивные методы экземпляра count и objectAtIndex :.Эти методы должны работать с резервным хранилищем, которое вы предоставляете для элементов коллекции.Для этого резервного хранилища вы можете использовать статический массив, стандартный объект NSArray или какой-либо другой тип данных или механизм.Вы также можете переопределить, частично или полностью, любой другой метод NSArray, для которого вы хотите предоставить альтернативную реализацию.

Как рекомендуется в тех же документах, попробуйте категорию или состав, а не наследование.

0 голосов
/ 09 мая 2011

NSMutableArray - это кластер класса - класс NSMutableArray просто определяет интерфейс, и когда вы создаете его экземпляр, вы получаете объект другого, закрытого типа. Это делает NSMutableArray и другие кластеры классов трудными для подкласса, вам будет гораздо лучше с композицией. Прочтите Пятничные вопросы и ответы с Майком Эшем , если вас интересуют подробности [gory].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...