一切正常,直到我调用saveFile
方法(如下所示)将文件写回磁盘,然后崩溃。我做错了什么?
这是我viewDidLoad
方法的一部分,我打开文件,工作正常。
//Get The Path
[self initPath];
dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];
if (accountsArray == nil) {
accountsArray = [[[NSMutableArray alloc]init] autorelease];
}
if (countArray == nil) {
countArray = [[[NSMutableArray alloc]init] autorelease];
}
countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];
然后我将它加载到tableview中。然后我添加一些新项目,它工作正常。然后我调用此方法来保存它并崩溃:
-(void)saveFile {
[dictionary setObject:accountsArray forKey:@"username"];
[dictionary setObject:countArray forKey:@"count"];
[dictionary writeToFile:accountsFilePath atomically:YES];
}
答案 0 :(得分:1)
初始化后,您正在自动释放countArray
和accountsArray
。当你试图保存它们时,它们可能已经被释放了。尝试为这两个人评论autorelease
(并记住在某个地方发布,可能在dealloc
方法中)。
答案 1 :(得分:0)
您的所有变量都在范围内吗?我假设accountsFilePath和字典是类变量?如果不是,他们可能会在viewDidLoad结束时死亡。
另一件可能会咬你的是你的字典容量太小,或者iPhone不喜欢你使用setObject方法来覆盖这样的键/值对。也许尝试调用removeObjectForKey:然后将其添加回上面?
答案 2 :(得分:0)
你可能已经这样做了,但我会在gdb中检查字典和accountsFilePath,或者在writeToFile:atomically:call之前使用NSLog。
您可能还想分享更多周围的代码,以显示与此词典相关的其他内容。
我一直在使用NSZombie成功调试随机崩溃。
答案 3 :(得分:0)
//如果找不到路径,文件没有加载,反过来字典就是nil
dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];
//首次创建accountsArray,countArray
if (accountsArray == nil) {
accountsArray = [[[NSMutableArray alloc]init] autorelease]; }
if (countArray == nil) {
countArray = [[[NSMutableArray alloc]init] autorelease]; }
//嘿嘿为什么你再次将accountsArray分配给一个新的,那你刚刚初始化的那个怎么样?
//如果字典为零,则countarray也将为零
countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];
//// //// ////////////////////////////////////////////////// //////////////
你可能想知道的一件事
writeToFile不会为您创建新文件夹
所以accountsFilePath中的所有文件夹都必须存在。
否则您可能希望使用nsfilemanager
创建该文件夹