2012-04-13 51 views
2

在任何人说它的一个问题之前已经被问过很多次,我已经经历了大约20个不同的答案并尝试了我找到的所有东西。尽管如此,我只在5天前开始了客观的C,所以可能有一些非常简单的解决方案。NSUserDefaults不加载字符串数组

看起来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]; 

这是开始,现在成为一个非常令人沮丧的问题,我已经找到了隔离问题的方法,并在阅读部分得出了它的结论。 Mutable数组在头文件中声明。请帮帮忙,这已被窃听我现在约6小时...

+0

你把什么样的对象为fishArray? – 2012-04-13 10:25:00

+0

字符串,你的鱼的名字.. Theres也是一个名为fishSizeArray的数组,它是相同的 – DuskFall 2012-04-13 10:28:34

+0

我在这里混淆了。你什么时候把对象设置为默认值?在你分配它之前..?因为你正在分配fishArrayMutable&同一时间你要求fishArrayMutable存储在默认值。所以我很困惑..!如果我丢失了任何东西,请帮助我 – 2012-04-13 10:32:43

回答

3

我怀疑是错误之一:

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

打破每一步,并在每一步之前和之后写测试。

1)NSLogfishArrayMutable它被写入来验证数组内容。
2)将fishArrayMutable写入默认值NSLog后立即默认为用户。 例子:

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

注意,NSLog报表做使用defaults让他们自给自足的。

做类似NSLog语句包围读(并且使读取两个语句):

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];

1

尝试使用mutableArrayValueForKey检查该link

这样使用:

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

它为我工作

编辑

写作:

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

负载:

NSMutableArray *array = [defaults mutableArrayValueForKey:@"fishArray"]; 
+0

???没有得到它.. – Frade 2012-04-13 11:51:19

+0

你尝试加载像我指示的阵列?我加载这样一个可变阵列,从来没有问题..实际上是在AppStore – Frade 2012-04-13 11:52:18

+0

没有问题,但该类是有趣的,而不是人们所期望的:'NSLog(@“array className:%@”,NSStringFromClass([array class]));'是'NSKeyValueSlowMutableArray'。 – zaph 2012-04-13 12:27:31