NSUserDefaults не сохраняет - PullRequest
       50

NSUserDefaults не сохраняет

2 голосов
/ 16 ноября 2011

Я использую метод NSUserDefaults для сохранения данных.Я сохраняю int и NSMutableArray.

Int сохраняется должным образом, когда приложение завершает работу, входит в фон или переключается на другое представление.Массив сохраняется, когда приложение переходит в фоновый режим и когда он переключается на другое представление, но не сохраняется каждый раз, когда я выхожу из симулятора и возвращаюсь, даже если я использую один и тот же код для int и NSMutableArray.*

Вот мой код для определения NSMutableArray:

array = [[NSMutableArray alloc] init];
if ([prefs objectForKey:@"array"] != nil) {
array = [prefs objectForKey:@"array"];
}

А затем для редактирования и сохранения:

[array addObject:anObject];
[prefs setObject:array forKey:@"array"];
[prefs synchronize];

В int есть точно такой же код, за исключением изменений междучасти array и int.

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

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 20 ноября 2011

"Значения, возвращаемые из NSUserDefaults, являются неизменяемыми, даже если вы устанавливаете изменяемый объект в качестве значения."

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

Вы назначаете указатель на неизменяемый NSArray , возвращаемый [NSUserDefaults objectForKey:...] на указатель на NSMutableArray .Затем вы используете addObject: для NSArray (который не имеет никакого эффекта) и сохраняете неизмененный NSArray .

(У вас также может быть утечка памяти, так как вы каждый раз выделяете NSImmutableArray.)

2 голосов
/ 17 ноября 2011

Используйте этот код.

Это определенно сохранит и восстановит ваши значения NSUserDefault.

- (void) retrieveMyState
 {
//Retrieving
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSInteger *yourIntValue = [prefs integerForKey:@"yourIntValue"];

    // convert your NSData to array, and then use it as required.   

NSData *dataRepresentingSavedArray = [prefs objectForKey:@"yourArray"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        yourArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
        yourArray = [[NSMutableArray alloc] init];
}

}


 -(void) saveMyState 
{
//saving
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

[prefs setInteger:yourIntValue forKey:@"yourIntValue"];

    // convert your array to NSData & then save it as object.

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
[prefs setObject:data forKey:@"yourArray"];

[prefs synchronize];
 }
0 голосов
/ 16 ноября 2011

Вы не можете сохранить "int".Это не NSObject.

Но вы можете встроить NSNumber в ваш массив, и это сохранит.

Попробуйте [NSNumber numberWithInt: ] (я связался с документацией Apple).

Надеюсь, это решит проблему.

0 голосов
/ 16 ноября 2011

Запись:

NSMutableArray* array = [NSMutableArray array];
if ([prefs objectForKey:@"array"] != nil)
    [array setArray:[prefs objectForKey:@"array"]];

при определении NSMutableArray.

...