这是许多EXC_BADACCES问题之一,但我已经做了很长时间的研究,并认为这个问题尚未得到解答.我的应用程序在首选项中保存数据.一切都很好,如果我删除首选项并启动应用程序,那么根本不会发生任何加载.但如果发生加载,就会出现问题.我必须保存一个主数组,其中包含一个名为Box的自写对象.One Box有一个NSString*boxName和六个NSMutableArray*,它们包含另一个自编写的对象,称为Flashcard,它包含两个NSString*:问题和答案.如果AppDelegate获取消息applicationWillTerminate,它将使用NSKeyedArchiver对主数组(称为boxArray)进行编码,并将其保存在首选项中.在AppControll的init方法中,此归档文件是从首选项加载的:
- (id)init {
self = [super init];
if (self) {
// Initialization code here.
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSData* archive = [defaults objectForKey:@"boxArray"];
if (archive) {
NSArray* array = [NSKeyedUnarchiver unarchiveObjectWithData:archive];
boxArray = [NSMutableArray arrayWithArray:array];
} else {
boxArray = [[NSMutableArray alloc] init];
}
}
return self;
Run Code Online (Sandbox Code Playgroud)
}
在Box的encodeWithCoder方法中,它为它的所有数组创建了sereval NSData*对象,就像这样.
NSData* p1archv = [NSKeyedArchiver archivedDataWithRootObject:phase1];
[aCoder encodeObject:p1archv forKey:@"phase1"];
Run Code Online (Sandbox Code Playgroud)
它加载如下所有内容:NSData*p1archv = [aDecoder decodeObjectForKey:@"phase1"];
if (p1archv) {
NSArray* a = [NSKeyedUnarchiver unarchiveObjectWithData:p1archv];
phase1 = [NSMutableArray arrayWithArray:a];
NSLog(@"loaded phase1: %@",phase1); …Run Code Online (Sandbox Code Playgroud)