Неверная сводка по NSMutableArray

Мне нужен совет специалиста, как решить эту проблему. Я занимаюсь тестированием нового приложения для iPad.

Я создаю NSMutableArray (ballPath) в viewDidLoad моего контроллера представления (он объявлен в моем.h файле), загружая файл plist, созданный в другом приложении.

ballPath = [[NSMutableArray alloc] initWithCapacity:1000];

NSString *path=[[NSBundle mainBundle] pathForResource:@"level_1" ofType:@"plist"];

ballPath = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

Этот массив теперь содержит несколько CGPoints (хранится в другом приложении как NSValues ​​и в архиве).

Затем я рисую путь (все еще в моем viewDidLoad), который работает нормально, поэтому путь должен работать нормально.

Когда позже я захочу прочитать массив в ответ на изменения в ускорении, я получу EXC_BAD_ACCESS. Когда я отлаживаю и смотрю на мой массив, это выглядит так:

Я тестирую и заменяю загруженный массив этим (также в viewDidLoad):

    ballPath = [[NSMutableArray alloc] initWithObjects:
            [NSValue valueWithCGPoint:CGPointMake(100.0, 100.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 200.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 300.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 400.0)],
            [NSValue valueWithCGPoint:CGPointMake(125.0, 450.0)],
            [NSValue valueWithCGPoint:CGPointMake(150.0, 500.0)],
            [NSValue valueWithCGPoint:CGPointMake(300.0, 600.0)],
            [NSValue valueWithCGPoint:CGPointMake(350.0, 550.0)],nil];

Тогда это работает просто отлично!

Что мне здесь не хватает????

Я нахожусь на Xcode 4.0.2, и моя цель - iOS 4.3.

1 ответ

Решение

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

unarchiveObjectWithFile: возвращает автоматически освобожденный объект. Если вы хотите сохранить массив, вам нужно сохранить его (или сделать его сохраненным свойством). Alloc-init двумя строками ранее совершенно лишний (и, возможно, утечка памяти), потому что вы никогда ничего не делаете с созданным там массивом, он заменяется массивом, который вы загружаете из пакета.

Другие вопросы по тегам