2

在有人说这是一个以前被问过很多次的问题之前,我已经经历了大约 20 个不同的答案并尝试了我发现的所有内容。尽管如此,我大约 5 天前才开始使用目标 c,所以可能有一些非常简单的解决方案。

似乎 NSUserDefaults 不会从默认属性列表中加载数组,尽管以许多不同的方式被调用。在我继续之前,这是我读取数组的代码:

      fishArrayMutable = [[NSMutableArray alloc] initWithArray:(NSArray*)[defaults objectForKey:@"fishArray"] copyItems:TRUE];

     if (fishArrayMutable == nil)
     {
       fishArrayMutable =  [[NSMutableArray alloc] init];
       UIAlertView *alert = [[UIAlertView alloc] init];
       [alert setTitle:@"fishArray = nil"];
       [alert addButtonWithTitle:@"Ok"];
       [alert show];
       [alert release];
     }

这是我编写数组的代码:

[defaults setObject:fishArrayMutable forKey:@"fishArray"];

[defaults synchronize];

现在这开始成为一个非常令人沮丧的问题,我已经研究了隔离问题的方法,并得出结论,它在阅读部分。可变数组在头文件中声明。请帮忙,这已经困扰了我大约 6 个小时了......

4

2 回答 2

3

我怀疑错误是以下之一:

  1. defaults未初始化。
  2. 在阅读之前未设置 userDefaults
  3. userDefaults 被覆盖之前的阅读。

分解每一步并在每一步之前和之后编写测试。

1)NSLog fishArrayMutable写入其中以验证数组内容。
2)在写入fishArrayMutable默认值后立即NSLog用户默认值。例子:

NSLog(@"Before writing fishArray: %@", fishArrayMutable);
[defaults setObject:fishArrayMutable forKey:@"fishArray"];
NSLog(@"After writing fishArray: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"fishArray"]);

请注意,这些NSLog语句使用defaults保持它们自包含。

做类似NSLog的语句将 read 括起来(并使 read 两个语句):

NSLog(@"Before reading fishArray: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"fishArray"]);
NSArray *fishArray = [defaults objectForKey:@"fishArray"];
NSLog(@"After reading fishArray: %@", fishArray);
fishArrayMutable = [[NSMutableArray alloc] initWithArray:fishArray copyItems:TRUE];
NSLog(@"After creating fishArrayMutable: %@", fishArrayMutable);

那么问题应该就比较明显了。

注意:由于数组项本身将是不可变的,NSUserDefaults而不是:
fishArrayMutable = [[NSMutableArray alloc] initWithArray:fishArray copyItems:TRUE];
您应该能够只使用mutableCopy
fishArrayMutable = [fishArray mutableCopy];

于 2012-04-13T11:03:32.173 回答
1

尝试使用mutableArrayValueForKey检查此链接

像这样使用它:

fishArrayMutable = [[NSMutableArray alloc] initWithArray:[defaults mutableArrayValueForKey:@"fishArray"]];

这个对我有用

编辑

写作:

[defaults setObject:fishArrayMutable forKey:@"fishArray"];
[defaults synchronize];

加载:

NSMutableArray *array = [defaults mutableArrayValueForKey:@"fishArray"];
于 2012-04-13T11:17:50.860 回答