我有一个菜单场景,帮助场景,设置场景和游戏场景。当我进入游戏场景时,它会将.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];
}
但为什么崩溃我不理解,却找不到解决方案。
答案 0 :(得分:2)
我认为你不应该发布捆绑 “[[NSBundle mainBundle] bundlePath]”应该返回一个自动释放对象。
然后当你发布它时,它的relain计数应该在第4次达到0并且崩溃应用程序
答案 1 :(得分:1)
如果您不拥有该物品,则不得释放该物体
只有在增加了保留计数时,才负责(自动)释放对象。通过显式调用retain
或通过调用名称中的alloc,copy或new方法来调用。
顺便说一句,如果你运行分析器(你可以在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);
}
我的猜测是filePath
是nil
。
也许在NSLog(@"filePath: %@", filePath);
(void) addObjectsToArray:(NSMutableArray*) mutableArray fromFile:(NSString*) filePath
干杯队友。