iPhone sdk 4.1:当我第三次尝试访问.plist文件时应用程序崩溃

时间:2010-10-27 07:23:58

标签: iphone file-io crash iphone-sdk-4.1

我有一个菜单场景,帮助场景,设置场景和游戏场景。当我进入游戏场景时,它会将.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 个答案:

答案 0 :(得分:2)

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

然后当你发布它时,它的relain计数应该在第4次达到0并且崩溃应用程序

答案 1 :(得分:1)

如果您不拥有该物品,则不得释放该物体 只有在增加了保留计数时,才负责(自动)释放对象。通过显式调用retain或通过调用名称中的alloc,copy或new方法来调用。

请再次阅读Memory Managment Guide


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

答案 2 :(得分: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

干杯队友。