iOS / iPhone SDK:未调用initWithCoder和encodeWithCoder

时间:2010-09-20 16:59:55

标签: cocoa-touch ios

我正在尝试保存名为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;

}

任何帮助将不胜感激!

2 个答案:

答案 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];
}

但是如果你只是想保存数组,我想你可以使用saveQueuePressedloadQueuePressed,我认为你不需要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,希望