如何在NSUserDefaults中保存NSMutableDictionary

时间:2011-03-26 06:07:29

标签: iphone nsuserdefaults nsmutabledictionary application-shutdown data-persistence

我需要在NSUserDefaults中保存NSMutableDictionary。我在网上搜索了很多例子,但没有收到任何足够相关的例子。有人可以发布一小段代码,它会在关机时在NSUserDefaults中保存NSMutableDictionary,并在应用程序启动时检索它吗?你也可以告诉我在哪里放置代码。

我自己有一些代码,但它无效。

appDelegate.h - 检索数据

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      NSData *dat = [defaults objectForKey:@"theKey"];
      tmpArray  = [[NSMutableArray alloc] init];
      tmpArray = [NSKeyedUnarchiver unarchiveObjectWithData:dat];

      [self.window makeKeyAndVisible];
      [window addSubview:tabBarController.view];
      return YES;
}

appDelegate.h - 存储数据

- (void)applicationWillTerminate:(UIApplication *)application {

      [self saveContext];
      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      NSData *dat = [NSKeyedArchiver archivedDataWithRootObject:tmpArray];
      [defaults setObject:dat forKey:@"theKey"];
}

是的,它适用于数组,但我需要一个用于NSMutableDictionary。

1 个答案:

答案 0 :(得分:5)

关于applicationWillTerminate:

的讨论
  

对于不支持后台执行或链接到iOS 3.x或更早版本的应用程序,当用户退出应用程序时,始终会调用此方法。 对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,在应用程序的情况下可能会调用此方法正在后台运行(未暂停),系统需要因某种原因终止它。

要保存对象,您应该将代码放入applicationDidEnterBackground:

  

在iOS 4.0及更高版本中,当用户退出支持后台执行的应用程序时,将调用此方法而不是applicationWillTerminate:方法。您应该使用此方法释放共享资源,保存用户数据,使计时器无效,并存储足够的应用程序状态信息,以便将应用程序恢复到当前状态,以防以后终止。您还应该禁用应用程序的更新用户界面并避免使用某些类型的共享系统资源(例如用户的联系人数据库)。您还必须避免在后台使用OpenGL ES。


要保存字典而不是数组,只需将所有出现的数组替换为字典


修复泄漏

tmpArray  = [[NSMutableArray alloc] init]; // not used, not released but `alloc`ed.
tmpArray = [NSKeyedUnarchiver unarchiveObjectWithData:dat];

删除第一行。