Неверная сводка по 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 двумя строками ранее совершенно лишний (и, возможно, утечка памяти), потому что вы никогда ничего не делаете с созданным там массивом, он заменяется массивом, который вы загружаете из пакета.