NSMutableArray в appdelegate - EXEC_BAD_ACCESS

Я пытаюсь использовать глобальный массив в appdelegate как быстрое исправление для демонстрации, которую я создаю. Соответствующий код для этого

.h файл имеет объявление

{
NSMutableArray * trnEntered;
}

@property (неатомный, сохранить) NSMutableArray * trnEntered

.m файл имеет следующий код -

trnEntered = [[NSMutableArray alloc] init];
NSLog (@% @, [trnEntered count]); // выводит null.
[trnEntered addObject: @ 1];
NSLog (@% @, [trnEntered count]); // выполняет неверный доступ.

Не уверен, что я здесь ошибаюсь. Выглядит довольно просто.

Заранее благодарим за помощь,
Тея.


person Tejaswi Yerukalapudi    schedule 07.06.2010    source источник


Ответы (4)


Похоже, проблема с вашим кодом:

NSLog(@"%@",[trnEntered count]); // prints null.
[trnEntered addObject:@"1"]; 
NSLog(@"%@",[trnEntered count]); // exec bad access.

Оба вызова NSLog пытаются напечатать NSUInteger как объект Objective-C. Это вызовет проблему. Вы должны использовать NSLog(@"%d", [trnEntered count]);

Я бы посоветовал вам ознакомиться с спецификаторами формата, там много полезной информации.

Еще немного информации: второй NSlog пытается распечатать description объекта NSObject, который, как утверждает код, находится в ячейке памяти 0x00000001.

person Lyndsey Ferguson    schedule 07.06.2010
comment
Ах, я знал, что это было что-то вроде этого, не могу поверить, что потратил на это 2 часа. Благодарность! - person Tejaswi Yerukalapudi; 07.06.2010
comment
Пожалуйста. Я тоже потратил слишком много времени на простые задачи :) - person Lyndsey Ferguson; 07.06.2010

Первый NSLog не должен печатать «null», у вас проблема с тем, как вы инициализируете. Попробуйте это вместо этого.

trnEntered = [[NSMutableArray alloc] initWithCapacity:1];
person Fabien    schedule 07.06.2010

trnEntered = [[NSMutableArray alloc] init];
NSLog(@"%@",[trnEntered count]); // prints null.
[trnEntered addObject:@"1"];
NSLog(@"%@",[trnEntered count]); // exec bad access.

Причина в том, что вы неправильно используете строку форматера. Вы пытаетесь использовать целое число в качестве указателя на строку, что, конечно, приведет к ошибке сегментации (или EXC_BAD_ACCESS в терминах Apple). Используйте% d для вывода целого числа, которое возвращает [trnEntered count].

person futureelite7    schedule 07.06.2010

NSLog по умолчанию выводит ответ в строковом формате, поэтому, если вы хотите распечатать целочисленное значение, вы должны использовать %d и его значение.

person Yashesh    schedule 04.02.2011