我正在尝试保存名为queueArray的NSMutableArray
,以便在应用程序退出后再次加载它。我用了一些教程让我走了,这就是我想出的代码。问题似乎是“initWithCoder
”和“encodeWithCoder
”未被调用,没有NSLog
次调用显示,并且没有在断点处停止。我已将NSCoding
协议添加到.h文件中,我知道queueArray不是nil且包含MPMediaItem
s。以下是我用来尝试保存和加载数组的一些代码:
-(IBAction)saveQueuePressed {
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];
//should cause encodeWithCoder to be called
[NSKeyedArchiver archiveRootObject:queueArray toFile:filePath];
}
-(IBAction)loadQueuePressed {
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];
//should cause initWithCoder to be called
queueArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
-(void)encodeWithCoder:(NSCoder *)coder {
NSLog(@"encodeWithCoder");
[coder encodeObject:queueArray forKey:@"savedQueueArray"];
}
-(id)initWithCoder:(NSCoder *)decoder {
NSLog(@"initWithCoder");
queueArray = [decoder decodeObjectForKey:@"savedQueueArray"];
return self;
}
任何帮助将不胜感激!
答案 0 :(得分:1)
归档/取消归档响应它们的对象时,将调用encodeWithCoder:
和initWithCoder
方法。根据我的理解,你的课程中有这些方法,但实际存档的对象(queueArray
)不是该类的实例,而是NSMutableArray
。
如果您确实要保存整个对象,可以将saveQueue方法更改为此
-(IBAction)saveQueuePressed {
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"];
// saving the array shouldn't, but saving the self object
//should cause encodeWithCoder to be called:
[NSKeyedArchiver archiveRootObject:self toFile:filePath];
}
但是如果你只是想保存数组,我想你可以使用saveQueuePressed
和loadQueuePressed
,我认为你不需要encode/init WithCoder:
方法
更新: 也许你的道路不对。 尝试
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [[rootPath stringByAppendingPathComponent:@"queueArray.archive"] stringByExpandingTildeInPath]];
答案 1 :(得分:0)
我也有这个问题。从字典的原子写入方法切换到keyedArchiver修复它,幸运的是我只需要改变一件事,就是说writeToFile的行:现在是归档函数。
现在我的计划正在运作。出于某种原因,即使在响应NSCoding时,自定义对象也没有被编码并且会破坏我的字典。这是iOS的错误吗?我已经阅读了相当数量的Apple手册,但我也看到过相当多的拼写错误和缺失的信息(例如,尝试没有视频解释它们的MKMapRect函数),或者在学习之前引用Run Loop的Core Animations线程,我可以继续,在Quartz中完成一半的句子...所以是的,我已经阅读了手册,这让我感到困惑,我们必须在某些时候获得更开放的iOS SDK,希望