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];
}
值有时会被保存,有时会被恢复.我无法确定它是什么或不能使它起作用.
还有其他人有类似的经历吗?关于什么可能使它工作的任何建议?同步方法是强制磁盘写入并使值保存的最佳方法,还是有更好的方法(对于生产和模拟器而言).
谢谢瑞恩
您应该使用 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)
从默认值加载旧值。
我在退出时使用同步写入磁盘,根据我的经验,它非常可靠。
| 归档时间: |
|
| 查看次数: |
2321 次 |
| 最近记录: |