当我尝试这段代码时:
if ([[NSFileManager defaultManager] fileExistsAtPath:@"~/Library/Application Support/Staying Afloat/stats/static-stats.plist"] == NO) {
NSMutableDictionary* tempDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:
[[NSString alloc] initWithString:@"0"],@"completedGames",
[[NSString alloc] initWithString:@"0"],@"floatsCollected",
[[NSString alloc] initWithString:@"0"],@"sec",
[[NSString alloc] initWithString:@"0"],@"subScore",
[[NSString alloc] initWithString:@"0"],@"highScore",
[[NSString alloc] initWithString:@"0"],@"longestSec", nil];
[tempDict writeToFile:@"~/Library/Application Support/Staying Afloat/stats/static-stats.plist" atomically:YES];
NSLog(@"written file");
}
并以
输出2012-04-14 19:15:10.009 Staying Afloat[3227:9c07] written file
所以循环已经运行,但文件没有被写入? 任何人都可以指出我在正确的方向上将plist保存到非本地化的地方吗?
编辑:这是针对mac的
答案 0 :(得分:6)
您需要在编写时使用-(NSString *)stringByExpandingTildeInPath
扩展路径并检查文件是否存在。
编辑:阅读NSDictionary文档中的方法writeToFile:automatically
。它说
如果path包含波形符(〜)字符,则必须在调用此方法之前使用stringByExpandingTildeInPath展开它。
所以只需做一些像
这样的事情[tempDict writeToFile:[[NSString stringWithString:@"~/Library/Application Support/Staying Afloat/stats/static-stats.plist"] stringByExpandingTildeInPath] atomically:YES];
答案 1 :(得分:1)
首先你不能写:
[tempDict writeToFile:@"~/Library/Application Support/Staying Afloat/stats/static-stats.plist" atomically:YES];
NSLog(@"written file");
因为你没有检查文件是否真的写成功。
你应该写:
if([tempDict writeToFile:@"~/Library/Application Support/Staying Afloat/stats/static-stats.plist" atomically:YES]) {
NSLog(@"written file");
} else {
NSLog(@"file not written");
}
WriteToFile方法返回一个布尔值。
答案 2 :(得分:0)
我总是使用NSUserDefaults来处理所有事情,例如用户prefs或在运行之间存储app状态。在我的头脑中,我建议你没有正确的权限来编写一个plist,如果你不小心破坏了一个重要的密钥和os值,会发生什么?看看
Best practices for handling user preferences in an iPhone MVC app?
答案 3 :(得分:0)
您确定-writeToFile:atomically:
会返回YES
吗?