0

我正在以这种方式向 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];

括号外,因为即使数据在那里,也没有正确写入或读取:

我收到此错误:-[NSKeyedUnarchiver initForReadingWithData:]: data is NULL

我做错了什么??

4

3 回答 3

1

改变这个:

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

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

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

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

在类描述中记录了在用户默认值中保存数组和字典的能力。

于 2012-08-22T12:18:50.323 回答
0

我有一种替代方法是在 doc dir 中保存 mutablearray 然后检索它:

// 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);

}
于 2012-08-22T10:22:15.163 回答
0

你永远不会初始化你的myIntegers. 第一次save从默认值中获取 key 对象时,您会得到一个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];
}
于 2012-08-22T10:23:53.890 回答