Цель C: почему не работает мой NSMutableArray? - PullRequest
2 голосов
/ 20 ноября 2010

Я довольно новичок в ObjC и его изменяемых массивах. Это сводит меня с ума; -)

Я делаю следующее:

mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) [mColumns addObject:[[MyColumn alloc] init]];

После этого кода мой массив "mColumns" содержит 5 элементов. Но каждый из них является NULL-указателем! (Или, по крайней мере, так говорит мне отладчик). Я уже проверил, что код

[[MyColumn alloc] init]

Дает мне несколько допустимых объектов, поэтому я не знаю, почему мой массив заполняется 0x0s Можете ли вы дать мне подсказку?

Ответы [ 3 ]

2 голосов
/ 20 ноября 2010

Сохраните свой mutableArray, если хотите, чтобы он оставался без изменений.В конце текущего цикла обработки событий он будет автоматически освобожден, как и в autoreleasePool.

В этот момент все ставки отключены.Ваша переменная mColumns просто указывает на ненужную часть памяти, может быть, другой объект, может быть, половину объекта, может быть, даже вы все равно можете получить правильный счет или даже содержащийся объект, но в какой-то момент ваше приложение вылетит,

Просто быстрый момент, если [[mColumns objectAtIndex:x] addObject:g]; дает сбой вашему приложению, это [mColumns objectAtIndex:x], что вызывает сбой, или это addObject:g?

Почему бы не поместить их в отдельные строки и выяснить?

0 голосов
/ 20 ноября 2010

Хммм. Я вижу одну проблему в вашем коде, но не одну, которая может вызвать эту проблему: вы добавляете сохраненные объекты в массив; сначала вы захотите автоматически выпустить их, чтобы не пропустить.

Что касается вашей настоящей проблемы, я не знаю. Невозможно заполнить массив нулевыми указателями; только объекты типа id (не произвольные указатели) могут быть помещены в NSArray / NSMutableArray.

Я знаю, что вы сказали, что проверили -[MyColumn init], но было бы неплохо проверить, что он производит правильные объекты именно в этом месте.

columns = [NSMutableArray array];
for (int i = 0; i < 5; i++) {
  id c = [[[MyColumn alloc] init] autorelease];
  /* set a breakpoint here, and type `po c`
     into the debugger to see what was created
   */
  [columns addObject:c];
}

Если -[MyColumn init] не делает какие-то действительно прикольные объекты, я не могу понять, в чем проблема. Интересно, происходит ли что-то странное с mColumns; например, оно удерживается чем-либо?

0 голосов
/ 20 ноября 2010

Я знаю, что вы говорите, что объекты расположены правильно, но я был бы склонен проверить это. Вот тот же код с дополнительной отладкой:

NSMutableArray *mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) {
  MyColumn *col = [[MyColumn alloc] init];
  NSLog(@"%d: %@", i, col);
  [mColumns addObject:col];
  [col release];
}
NSLog(@"Array has %d elements, first is %@", [mColumns count], [mColumns objectAtIndex:0]);

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

...