0

我有一个菜单场景、帮助场景、设置场景和游戏场景。当我进入游戏场景时,它会将一些数据字符串从 .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];

}

但是为什么崩溃我不明白并且还没有找到解决方案。

4

3 回答 3

2

我认为你不应该释放捆绑包
“[[NSBundle mainBundle] bundlePath]”应该返回一个自动释放对象。

然后当你释放它时,它的 relain 计数应该在第四次达到 0 并使应用程序崩溃

于 2010-10-27T07:56:58.283 回答
1

如果您不拥有该对象,则不得释放它。
仅当您增加对象的保留计数时,您才负责(自动)释放对象。通过retain显式调用或调用名称中带有 alloc、copy 或 new 的方法。

请再次阅读内存管理指南


顺便说一句,如果你运行分析器(你可以在 Build 菜单中找到它),它会指出你做错了什么的确切行。

于 2010-10-27T08:20:39.683 回答
0

任何堆栈跟踪?

无论如何尝试将它包装成一个try-catch。在处理来自捆绑包或下载的文件时,我总是这样做。

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

    NSString *path = [bundle stringByAppendingPathComponent:filePath];

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

我的猜测filePathnil。也许尝试NSLog(@"filePath: %@", filePath);在开始(void) addObjectsToArray:(NSMutableArray*) mutableArray fromFile:(NSString*) filePath

队友的欢呼声。

于 2010-10-27T07:55:49.077 回答