iPhone模拟器默认值中的不一致默认值(NSUserDefaults)行为

rya*_*ott 5 iphone ios-simulator

在开发iPhone应用程序并尝试通过标准NSUserDefaults机制保存首选项时,我一直遇到非常不一致的结果.我正在使用Erica Sadun的iPhone Developer's Cookbook中的代码(精彩的书btw),它看起来像这样:

(void) updateDefaults
{
    NSMutableArray *spells =  [[NSMutableArray alloc] init];
    NSMutableArray *locs = [[NSMutableArray alloc] init];

    for (DragView *dv in [boardView subviews]) 
    {
        [spells addObject:[dv whichSpell]];
        [locs addObject:NSStringFromCGRect([dv frame])]; 
    }

    [[NSUserDefaults standardUserDefaults] setObject:spells forKey:@"spells"];
    [[NSUserDefaults standardUserDefaults] setObject:locs forKey:@"locs"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [spells release];
    [locs release];
}

值有时会被保存,有时会被恢复.我无法确定它是什么或不能使它起作用.

还有其他人有类似的经历吗?关于什么可能使它工作的任何建议?同步方法是强制磁盘写入并使值保存的最佳方法,还是有更好的方法(对于生产和模拟器而言).

谢谢瑞恩

Bra*_*son 2

您应该使用 NSKeyedArchiver 来保存数组,例如:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:spells] forKey:@"spells"];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:locs] forKey:@"locs"];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

如果它是自定义类,您还应该确保您的拼写类实现 NSCoding 协议(encodeWithCoder: 和 initWithCoder:)。看起来你的位置是 NSString,它可以很好地存档。

你还需要做类似的事情

NSData *dataRepresentingSavedSpells = [currentDefaults objectForKey:@"spells"];
if (dataRepresentingSavedSpells != nil)
{
    NSArray *oldSpells = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedSpells];
}
Run Code Online (Sandbox Code Playgroud)

从默认值加载旧值。

我在退出时使用同步写入磁盘,根据我的经验,它非常可靠。