Objective c NSMutableArray到NSUserDefults未保存

Objective c NSMutableArray到NSUserDefults未保存,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我正在以这种方式读写NSuserdefults的数组: indexDelete = button.tag; NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"save"];

我正在以这种方式读写NSuserdefults的数组:

indexDelete = button.tag;

                    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
                    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"save"];
                    if (dataRepresentingSavedArray != nil)
                    {
                        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
                        if (oldSavedArray != nil)
                            myIntegers = [[NSMutableArray alloc] initWithArray:oldSavedArray];
                        else
                            myIntegers = [[NSMutableArray alloc] init];
                    }

                    [myIntegers addObject:[NSNumber numberWithInteger:indexDelete]];

                    NSLog (@"Array myIntegers: %@", myIntegers);

                    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myIntegers] forKey:@"save"];
如果我遵守规定,一切都会很好:

myIntegers = [[NSMutableArray alloc] init];
括号外,因为即使数据存在,也无法正确写入或读取:

我得到以下错误:-[NSKeyedUnachiver initForReadingWithData:]:数据为空


我做错了什么???

我有一个选择,就是在doc dir中保存可变数组,然后检索它:

// Get path to documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
if ([paths count] > 0)
{
    // Path to save array data
    NSString  *arrayPath = [[paths objectAtIndex:0]
                            stringByAppendingPathComponent:@"array.out"];

    // Write array
    [yourMutableArray writeToFile:arrayPath atomically:YES];


    // Read both back in new collections
    NSMutableArray *arrayFromFile = [NSMutableArray arrayWithContentsOfFile:arrayPath];        
    for (NSString *element in arrayFromFile) 
        NSLog(@"Items: %@", element);

}

您从不初始化您的
myinteger
。第一次从默认设置中获取key
save
对象时,会得到一个
nil
对象(因此不会输入
if
闭包并分配结构)。之后,您将尝试归档
nil
对象,这可能是导致错误的原因

尝试在此之前移动数组的初始化,并且仅添加上一次保存中的对象(如果存在):

myIntegers = [[NSMutableArray alloc] init];
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"save"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        [myIntegers addObjectsFromArray:oldSavedArray];
}
更改此项:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myIntegers] forKey:@"save"];

如果MyInteger将来不会发生变异(更改)。如果要更改,请使用:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:myIntegers] forKey:@"save"];

在用户默认设置中保存数组和字典的功能在类描述中有说明。

尝试插入
[[NSUserDefaults standardUserDefaults]同步][[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:myIntegers] forKey:@"save"];