iPhone:在应用程序被杀死时保留 NSUserDefaults 值

Posted

技术标签:

【中文标题】iPhone:在应用程序被杀死时保留 NSUserDefaults 值【英文标题】:iPhone: preserve NSUserDefaults values when application is killed 【发布时间】:2011-07-05 15:31:53 【问题描述】:

我正在尝试使用 NSUserDefaults 实现“添加到收藏夹”功能。到目前为止,我已经编写了以下代码。

- (void)favouriteButtonClicked:(id)sender

favselected = !favselected; // favselected is BOOL property
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString* viewname = @"custom";

if(favselected) 
    [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
    [appDelegate addTOFavourites:self.ViewID viewType:self.ViewType];
 else 
    [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
    [appDelegate removeFromFavourites:self.ViewID viewType:self.ViewType];


只要我的应用程序正在运行,它就可以正常工作,但是当我杀死我的应用程序时,我会丢失所有存储的值,因此下次加载视图时,在 viewload 中 isAddedToFavorites 方法返回 false。有没有办法维护我的价值观?我错过了什么吗?

    if([appDelegate isAddedToFavorites:self.ViewID]) 
        [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
        favselected = YES;
     else 
        [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
        favselected = NO;
    

编辑:

我尝试使用 NSMutableDictionary,因为我必须添加多个键值,但即使在将对象添加到字典之后,以下方法始终显示 Count=0。任何帮助将非常感激。谢谢。

-(BOOL)isAddedToFavorites:(NSString*)viewID 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID])
    return YES;

return NO;


-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(standardUserDefaults) 
    if(![dict objectForKey:viewID])
        [dict setObject:viewType forKey:viewID]; // It is coming here but still count zero!

    NSLog(@"count = %d", [dict count]);

    [standardUserDefaults setObject:dict  forKey:kFavouriteItemsKey]; // Always dict remains null with 0 objects in it
    [standardUserDefaults synchronize];
    [dict release];



-(void)removeFromFavourites:(NSString*)viewID viewType:(NSString*)viewType 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(standardUserDefaults) 
    if ([dict objectForKey:viewID])
        [dict removeObjectForKey:viewID];

    [standardUserDefaults setObject:dict  forKey:kFavouriteItemsKey];
    [standardUserDefaults synchronize];
    [dict release];


谢谢。

【问题讨论】:

尝试注销您发布的代码中的所有内容 另外,你有没有在某处初始化你的收藏夹数组? 注销所有内容是什么意思?我尝试更改 kFavoriteItemsKey 但没有运气。我已经用现有数据初始化字典对象。如果数据不可用,它将设置为 null,但我仍然会进行单独的初始化并查看它是否有任何区别。 使用 NSLog 语句将所有值记录到控制台。 我已经做到了! ViewID 和 ViewType 在通过时是正确的。 [dict setObject...] 也被执行,但在 dict 之后仍然保留 0 个对象! 【参考方案1】:

NSUserDefaults 实际上是用来永久存储值的,事实上,如果您为程序创建任何设置,它们将被保存为 NSUserDefaults。

我认为问题在于您没有使用您正在检索的相同密钥保存它。尝试像这样保存:

  //To save
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:appDefaults forKey:kFavouriteItemsKey];
  [[NSUserDefaults standardUserDefaults] synchronize];

  //To retrieve
 NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
 NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey]   mutableCopy];

字典试试:

 NSDictionary *myDictionary= [[NSUserDefaults standardUserDefaults] objectForKey:kFavouriteItemsKey];

        // Create a mutable dictionary to replace the old immutable dictionary
    NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];

        // transfer the old dictionary into the new dictionary
    [myMutableDictionaryaddEntriesFromDictionary:myDictionary];

        // Now add the data
    [myMutableDictionary setObject:myObject forKey:myKey];

【讨论】:

你是对的。这是我的错。我以前使用相同的键存储了一些无效的 NSData 值,这就是造成问题的原因。我已经更改了密钥名称并且它有效!谢谢!顺便说一句,这个值在 iPhone 上存储在哪里?如何在不参考我的应用程序的情况下删除它们?另外,您是否看到另一个问题,为什么我的计数器总是归零?它仍在发生。我无法存储多个键值。基本上我将当前默认值放入可变字典中,修改它们并将修改后的字典设置为默认值,但似乎不起作用! @AppleDeveloper 该值存储在您的应用程序“沙盒”中,因此它始终专门指您的应用程序,但是您可以只使用 [[NSUserDefaults standardUserDefaults] removeObjectForKey:myKey];删除任何你想要的NSUserDefaults,我不确定我是否看到了这个问题,你能把链接放上来吗?我可以看看。 您好 OscarMK,我已经编辑了我的问题,并添加了 cmets,这对您理解问题很有用。很久以来我一直在挠头。看不懂怎么回事!!任何帮助将不胜感激。谢谢。 @AppleDeveloper NSUserDefaults 总是返回不可变对象,我知道您正在发送 mutableCopy 消息,但由于某种原因它不能那样工作,您可以尝试我刚刚在我的答案中编辑的内容。 你是对的。我必须按照你的建议做,但最后一个问题是它无法与 NSUserDefaults 同步!我在您的答案中添加了最后三行。知道为什么它没有被存储吗?会不会是因为this?我尝试将字典转换为 NSData 但对我来说看起来很奇怪。无法再次获得密钥!

以上是关于iPhone:在应用程序被杀死时保留 NSUserDefaults 值的主要内容,如果未能解决你的问题,请参考以下文章

iOS React 在应用程序被杀死时推送通知

NSUser Defaults 保存按钮状态并再次显示

当应用程序被杀死(非活动)时,点击 Firebase 通知不起作用

当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误

iOS应用程序启动图像后杀死

登录 Facebook 时,Unity ios 游戏在后台被杀死