Objective c NSMutableArray到NSUserDefults未保存
我正在以这种方式读写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"];
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
。第一次从默认设置中获取keysave
对象时,会得到一个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]同步]设置键后,我修复了您使用David H answer提供给我的代码。对不起,我不能勾选你的两个答案
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:myIntegers] forKey:@"save"];