iPhone SDK 4.1: приложение ломается, когда я пытаюсь получить доступ к файлу.plist в третий раз
У меня есть сцена меню, сцена помощи, настройки сцены и сцена игры. Когда я вхожу в игровую сцену, он загружает некоторую строку данных из файла.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 ответа
Я думаю, что вы не должны выпускать расслоение
"[[NSBundle mainBundle] bundlePath]" должен возвращать объект автоматического освобождения.
Затем, когда вы отпустите его, его счет релеина должен достигнуть 0 в 4-й раз и завершит работу приложения.
Вы не должны выпускать объект, если вы не являетесь его владельцем.
Вы несете ответственность за (автоматическое) освобождение объекта, только если вы увеличили количество сохраняемых объектов. Либо по телефону retain
явным образом или путем вызова методов с alloc, copy или new в имени.
Пожалуйста, прочитайте Руководство по управлению памятью снова
Кстати, если вы запустите анализатор (вы можете найти его в меню Build), он укажет вам точную строку, где вы сделали что-то не так.
Любая трассировка стека?
В любом случае, попытайтесь обернуть это в попытку. Я всегда делаю это при обработке файлов, будь то из пакета или загруженных.
@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
Ура, приятель.