在有人说这个问题之前已经被问过很多次之前,我已经浏览了大约 20 个不同的答案,并尝试了我发现的所有内容。尽管如此,我大约 5 天前才开始使用 Objective 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 个小时了......
最佳答案
我怀疑错误是以下之一:
defaults
未初始化。- 在阅读之前未设置 userDefaults
- 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
语句不使用默认值
来保持它们的自包含性。
执行类似的 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];
关于iphone - NSUserDefaults 不加载字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10139074/