NSMutableArray count всегда возвращает ноль - PullRequest
7 голосов
/ 11 марта 2009

Я уверен, что делаю что-то глупое, но это сводит меня с ума.

Я пытаюсь перебрать результаты базы данных, создать объекты из этих результатов и добавить объекты в NSMutableArray. Я проверил через вызовы NSLog, что данные правильно считываются из базы данных и копируются в объект, но счет для NSMutableArray всегда возвращает 0.

Вот суть кода:

while ([rs next]) {

    Kana *htemp = [Kana alloc];

    htemp.content = [rs stringForColumn:@"hiragana"];
    [hiragana addObject:htemp];

}
NSLog(@"Hiragana contains %d objects", [hiragana count]);

Кана получена из NSObject, а хирагана является экземпляром NSMutableArray.

Я уверен, что это ошибка новичка, и я надеюсь, что кто-то может исправить меня. ТИА! :)

Ответы [ 3 ]

39 голосов
/ 11 марта 2009

Судя по опубликованному коду, я думаю, что вы, вероятно, неправильно распределяете свой массив. При создании объектов вам также нужно инициализировать их. Следовательно, это:

Kana *htemp = [Kana alloc];

Должно быть:

Kata *temp = [[Kana alloc] init];

Все объекты должны быть инициализированы таким образом. Таким образом, если я прав, а вы не инициализировали свой массив, то ваше создание должно идти из этого:

NSMutableArray *hiragana = [NSMutableArray alloc];

к этому:

NSMutableArray *hiragana = [[NSMutableArray alloc] init];

По причинам оптимизации вам, вероятно, также следует указать начальную емкость, если вы знаете, сколько объектов вы могли бы хранить:

[[NSMutableArray alloc] initWithCapacity:someNumber];
2 голосов
/ 11 марта 2009

Другая распространенная причина (не в вашем случае, как выясняется, но в целом) заключается в том, что вы забыли даже выделить массив. Если вы еще не создали массив, вы отправляете это сообщение count на nil, поэтому результат всегда будет равен 0.

0 голосов
/ 11 марта 2009

Несколько вещей:

  1. Что произойдет, если вы поместите вызов NSLog в цикл while? Убедитесь, что итерации цикла действительно выполняются, прежде чем обвинять его в массиве.
  2. Где вы создаете массив хирагана? Если по какой-то причине вы делаете это неправильно, а массив равен нулю, это может вызвать такие проблемы.
  3. Если у вас нет сборщика мусора, обязательно сделайте [htemp release] после добавления его в цикл. addObject сохраняется и каждый добавленный элемент будет вытекать из цикла. Опять же, это актуально, только если сборка мусора отключена.

Скорее всего, вы неправильно создали массив, или rs не содержит того, что вы ожидаете, и поэтому [rs next] никогда не будет вызываться (например, если rs равно nil, нет итерации этого цикла будут выполняться, и у вас не будет никаких ошибок).

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