Как сохранить NSMutableDictionary в NSUserDefaults - PullRequest
1 голос
/ 26 марта 2011

Мне нужно сохранить NSMutableDictionary в NSUserDefaults. Я искал в Интернете много примеров, но не получил ни одного, который достаточно актуален. Может кто-нибудь опубликовать небольшой кусок кода, который сохранит NSMutableDictionary в NSUserDefaults при завершении работы и получит его при запуске приложения? Также не могли бы вы сказать мне, где разместить код.

У меня есть код, но он не работает.

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 Ответ

5 голосов
/ 26 марта 2011

Обсуждение 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];

удалив первую строку.

...