Plist不会写入文件

时间:2012-04-14 07:26:49

标签: objective-c cocoa filesystems plist

当我尝试这段代码时:

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的

4 个答案:

答案 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吗?