无法在NSUserDefaults中保存NSMutableArray

时间:2011-12-20 14:27:54

标签: iphone objective-c ios nsmutablearray nsuserdefaults

我正在尝试在设备上保存NSMutableArray,但每次重新加载应用程序时都会删除数据。

我尝试使用NSUserDefaults,但问题仍然存在

这是我正在使用的代码

-(void) addingData{

    [data addObject:theBarcodeString]; //data is the NSMutableArray

    [mainTableView reloadData]; //this is a UITableView where the data from the NSMutableArray is populated
    [self endText];
    history=[NSUserDefaults standardUserDefaults];
    [history        setObject:data          forKey:@"history"  ];
}

这是我加载数据的地方

- (void)viewDidLoad
{
    ...
    if (data == nil) {
        data = [[NSMutableArray alloc] init]; //onload it always goes to his line

    else {

        data=[[NSUserDefaults standardUserDefaults] objectForKey:@"history"  ];
    }
    ...
}

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您不应该测试数据== nil。相反,只需:

data = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] 
    objectForKey:@"history"]];

请注意,您必须稍后再发布。

如果您希望data成为可变数组,必须使用:

data = [[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"history"];

如果尝试在不使用mutableArrayValueForKey的情况下对数据执行变异操作,则会发生崩溃,因为从NSUserDefaults返回的所有对象都是不可变的。

答案 1 :(得分:0)

  

synchronize 将对持久域的任何修改写入磁盘   并将所有未修改的持久域更新为磁盘上的内容。

     
      
  • (BOOL)同步
  •   
     

如果数据已成功保存到磁盘,则返回值YES,否则返回   NO。

所以你必须添加[history synchronize]来强制写默认值

修改:来自Docs

  

因为此方法会定期自动调用,   只有在您不能等待自动时才使用此方法   同步(例如,如果您的应用程序即将退出)或   如果要将用户默认值更新为磁盘上的内容,即使如此   你没有做任何改变。

因此,如果您想立即保存更改,请致电[history synchronize]