iPhone SDK 4.1: приложение ломается при попытке доступа к файлу .plist в третий раз - PullRequest
0 голосов
/ 27 октября 2010

У меня есть сцена меню, сцена справки, сцена настроек и сцена игры. Когда я вхожу в игровую сцену, он загружает некоторую строку данных из файла .plist в NSMutableArray. Я делаю эту процедуру чтения и загрузки следующим образом -

+ (void) addObjectsToArray:(NSMutableArray*) mutableArray fromFile:(NSString*) filePath
{
    NSString *bundle = [[NSBundle mainBundle] bundlePath];

    NSString *path = [bundle stringByAppendingPathComponent:filePath];

    [mutableArray addObjectsFromArray: [NSMutableArray arrayWithContentsOfFile:path]];
    [bundle release];

}

Я могу попасть на игровую сцену и оттуда вернуться на сцену меню. Но когда я пытаюсь попасть на игровую сцену четвертый раз (от сцены меню к игре, затем вернуться к сцене меню, снова перейти на сцену игры и сделать это), приложение просто падает.

Я нашел точку сбоя (используя NSLog) -

+ (void) addObjectsToArray:(NSMutableArray*) mutableArray fromFile:(NSString*) filePath
{
    NSString *bundle = [[NSBundle mainBundle] bundlePath];
    **NSLog(@"always reach here");**
    NSString *path = [bundle stringByAppendingPathComponent:filePath];**// CRASH POINT**
    **NSLog(@"Forth time, doesnt reach here");**

    [mutableArray addObjectsFromArray: [NSMutableArray arrayWithContentsOfFile:path]];
    [bundle release];

}

Но почему я не разбираюсь и пока не нашел решения.

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

Я думаю, что вы не должны выпускать комплект
«[[NSBundle mainBundle] bundlePath]» должен возвращать объект автоматического выпуска.

Затем, когда вы отпустите его, его счет реле должен достигнуть 0 в 4-й раз и завершить работу приложения.

1 голос
/ 27 октября 2010

Вы не должны освобождать объект, если вы не являетесь его владельцем.
Вы несете ответственность за (автоматическое) освобождение объекта, только если вы увеличили количество сохраняемых объектов. Либо вызывая retain явно, либо вызывая методы с alloc, copy или new в имени.

Пожалуйста, прочитайте Руководство по управлению памятью снова


Кстати, если вы запустите анализатор (вы можете найти его в меню Build), он укажет вам точную строку, где вы сделали что-то не так.

0 голосов
/ 27 октября 2010

Какая-либо трассировка стека?

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

@try {
    NSString *bundle = [[NSBundle mainBundle] bundlePath];

    NSString *path = [bundle stringByAppendingPathComponent:filePath];

    [mutableArray addObjectsFromArray: [NSMutableArray arrayWithContentsOfFile:path]];
    [bundle release];
}
@catch (NSException * e) {
    NSLog (@"exception: %@", exception);
}

Я предполагаю, что filePath - это nil. Может быть, попытаться NSLog(@"filePath: %@", filePath); в начале (void) addObjectsToArray:(NSMutableArray*) mutableArray fromFile:(NSString*) filePath

Приветствие, приятель.

...