NSUserDefaults上的偶尔EXC_BAD_ACCESS访问或同步

时间:2011-12-29 13:59:20

标签: objective-c xcode nsuserdefaults exc-bad-access

在基于标签的应用中,当我在某些标签之间切换时,我有时会获得EXC_BAD_ACCESS。这不是每一次,但如果你向前和向后轻弹几次,它最终会发生。

定义在.h:

NSUserDefaults *theData;

我在viewWillAppear和viewWillDisappear中有这个:

[theData synchronize];

在viewWillAppear阶段的函数中调用故障线:

NSMutableArray *thisArray = [theData objectForKey:@"FriendsArray"];

我正在使用NSUserDefaults来存储一些数据字典。这是由服务器调用填充的,但由于它经常刷新,因此不需要内部数据库。如果更好的话,我愿意接受存储这些数据的其他方式。

我尝试了许多内容,例如投放(NSMutableArray *)[theData objectForKey:@"FriendsArray"];或使用arrayForKey以及其他一些没有改进的事情。

非常感谢任何帮助或提示。

3 个答案:

答案 0 :(得分:1)

NSMutableArray *thisArray = [theData objectForKey:@"FriendsArray"]; // retain

您尝试使数组可变的方式是错误的。也就像那样写的,正如评论中所建议的那样,你应该保留那个数组。

尝试使用以下对象初始化/分配新的可变数组:

NSMutableArray *thisArray =
 [[NSMutableArray alloc] initWithArray:[theData objectForKey:@"FriendsArray"]];

另一种方法-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag;允许您制作原始对象的副本。

答案 1 :(得分:0)

NSUserDefaults中的值不可变。您正在尝试将不可变对象转换为可变对象。尝试将其转换为NSArray,然后将其转换回可变数组。应该解决你的问题。

答案 2 :(得分:0)

使用

没有真正的理由
NSUserDefaults *theData;

而是使用它来从UserDefaults恢复可变数组:

NSMutableArray *thisArray =
[[NSUserDefaults standardUserDefaults] objectForKey:@"FriendsArray"] mutableCopy];

这为您提供了RETAINED可变数组。

另请注意,您只需在保存到UserDefaults时使用同步,而不是在阅读时使用。您应该在每次保存后进行相同的同步,因为您的应用程序可能会崩溃或被iOS关闭,而您无需同步。