Objective-c NSMutableArray из объектов сохранить - PullRequest
0 голосов
/ 09 февраля 2012

Я просто не могу получить это! У меня есть собственный класс "Word", и я генерирую NSMutableArray объектов Word-класса в несколько шагов:

  1. words = [NSMutableArray array];
  2. для i = от 0 до 8
  3. слово = alloc + init;
  4. [words addObject: word];
  5. [выпуск слова];

Затем я передаю экземпляр instance установщику другого класса:

someInstance.words = words;

Если слова неатомичны, сохраняют свойство. Я объявляю метод setWords следующим образом:

-(void)setWords:(NSMutableArray *)w {
    [w retain];
    [words release];
    words = w;
}

Когда слова приходят в метод как переменная "w", это массив объектов, но когда я сохраняю его и присваиваю старое значение, моя переменная слов становится NSMUtableArray, и ее число равно w.count, но элементы массива 0x0. Оператор "=" не копирует элементы массива, как я могу это исправить? Пожалуйста, помогите, я новичок в объективе-c. Я создаю экземпляр Word только одним методом, должен ли я реализовать метод init без параметров?

-(id)initWithId:(int)Id Word:(NSString *)Word Card:(int)Card {
    self.id = Id;
    self.word = Word;
    self.card = Card;
    return self;
}

Цикл, в котором я генерирую свой NSMutableArray:

Card *card = [[Card alloc] initWithId:[s intForColumn:@"id"] Type:[s intForColumn:@"type"] Used:[s intForColumn:@"used"]];
s = [db executeQueryWithFormat:@"SELECT w.id as id, word, card FROM word as w INNER JOIN card as c ON w.card=c.id WHERE c.id=%i ORDER BY w.id, RANDOM()", card.id];
while ([s next]) {
    Word *word = [[Word alloc] initWithId:[s intForColumn:@"id"] Word:[s stringForColumn:@"word"] Card:[s intForColumn:@"card"]];
    [card.words addObject:word];
    [word release];
}

1 Ответ

0 голосов
/ 09 февраля 2012

Есть ряд проблем с вашим кодом.

  • вам необходимо следовать стандартному шаблону инициализации вызова инициализатора super и проверки возвращаемого значения.

  • Этот метод должен называться initWithId:word:card: (т. Е. Случай неправильный, следовательно, глупая раскраска на StackOverflow, даже).

  • Нет необходимости реализовывать пользовательский установщик / получатель, если ваш установщик / получатель просто следует стандартному шаблону. Используйте @property и @ synthesize.

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

  • Хотя вы упоминаете, что создаете экземпляр NSMutableArray, вы не показываете это в своем коде. card.words действительно установлен, когда вы добавляете Word экземпляров?

Показать реализацию метода -initWithId: card: type: used: (обратите внимание, я исправил регистр).

т.е. это лучше иметь что-то вроде:

 words = [NSMutableArray new]; // Or, if ARC, [NSMutableArray array];
<Ч />

ОК - следующий ...

  • поставить assert(card.words); перед вашим while() циклом ... который взорвется, если words не установлен.

  • убедитесь, что card не ноль (нет причин, почему это не должно происходить, но ... когда очевидный материал выглядит правильно, вы проверяете действительно очевидный материал далее)

Комментарий о -reloadData - это больше, чем вы бы хотели reloadData в любом случае, инициирующем загрузку в первую очередь. Представьте себе ситуацию, когда вы загружаете несколько различных типов данных перед обновлением всего пользовательского интерфейса; возможно, табличное представление должно быть перезагружено и некоторые другие вещи должны быть обновлены вокруг него. Перемещая reloadData из установщика, он (a) делает установщик простым и неудивительным, в то время как (b) упрощает рефакторинг вашего уровня пользовательского интерфейса, так что обновление элемента с несколькими пользовательскими интерфейсами может выполняться одновременно.

(Кроме того - пожалуйста, не принимайте мои комментарии о стиле кодирования резко ... не то, чтобы быть ... есть некоторые тонкие, но универсальные шаблоны для кодирования Obj-C. Если вы изучаете их и используете их, это сделает вашу жизнь намного проще. Мы все когда-то были новичками в Obj-C. Просто некоторые из нас были новичками в этом, в то время как другие из вас еще даже не родились.;).

...