NSFserDefaults类别未保存在didFinishLaunchingWithOptions()中

时间:2015-07-31 18:03:26

标签: ios iphone cocoa-touch nsuserdefaults

我已经设置了一个类别来保存这样的应用程序运行次数,

static NSString * const AppRuns = @"IP_AppRuns";

@implementation NSUserDefaults (RegisteredUser)

+ (void)saveRuns:(NSNumber *)value
{
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:AppRuns];
}

+ (NSNumber *)runs
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:AppRuns];
}
....

我已在我的App委托didFinishLaunchingWithOptions方法中设置它。

[NSUserDefaults saveRuns: @(21)];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"App has run %ld times", [[NSUserDefaults runs] integerValue]);

但是,我得到EXC_BAD_ACCESS,这让我怀疑它没有被保存。

但是,以下工作:

[[NSUserDefaults standardUserDefaults] setObject:@(17) forKey:@"AppRuns"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"App has run %ld times", [[[NSUserDefaults standardUserDefaults] valueForKey:@"AppRuns"] integerValue]);

我做错了什么?

1 个答案:

答案 0 :(得分:0)

+ (NSNumber *)runs使用objectForKey访问NSUserDefaults

您的第二个示例使用valueForKey来访问NSUserDefaults

valueForKeyobjectForKey都会返回给定键的对象。但这里valuForKey是键值编码(KVC)。

如果密钥不以“@”开头,则调用objectForKey:。如果key以“@”开头,则删除“@”并使用其余键调用[super valueForKey:]

已编辑

您可以重新安装应用(清除旧的NSUserDefaults值)并尝试使用此代码吗?

@implementation NSUserDefaults (RegisteredUser)

+ (void)saveRuns:
{
    NSNumber *runs = [[NSUserDefaults standardUserDefaults] objectForKey:AppRuns];
    [[NSUserDefaults standardUserDefaults] setObject:runs++ forKey:@"Runs"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

+ (NSNumber *)runs
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:@"Runs"];
}