Неверная сводка по NSMutableArray - PullRequest
1 голос
/ 18 мая 2011

Мне понадобится совет специалиста, как решить эту проблему. Я немного тестирую новое приложение для 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 ​​и в архиве).

enter image description here

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

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

enter image description here

Я проверяю и заменяю загруженный массив следующим (также в 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];

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

enter image description here

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

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

1 Ответ

1 голос
/ 18 мая 2011

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

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

...