initWithCoder没有按预期工作?

时间:2010-03-15 17:04:44

标签: objective-c cocoa-touch

这看起来是否正确,dataFilePath在磁盘上并包含正确的数据,但MSMutable数组在initWithCoder之后不包含任何对象?我可能只是遗漏了一些东西,但我想在继续之前快速检查一下。

-(id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if(self) {
        [self setReactorCore:[decoder decodeObjectForKey:@"CORE"]];
    }
    return self;
}

-(id)init {
    self = [super init];
    if(self) {
        if([[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) {
            NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
            NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
            NSMutableArray *newCore = [[NSMutableArray alloc] initWithCoder:unArchiver];
            [self setReactorCore:newCore];
            [newCore release];
            [data release];
            [unArchiver release];
        } else {
            NSMutableArray *newCore = [[NSMutableArray alloc] init];
            [self setReactorCore:newCore];
            [newCore release];
        }
    }
    return self;
}

EDIT_001

我想我知道我哪里出错了,我正在归档NSData,然后尝试用它初始化我的NSMutable数组。我将修改代码并发回更新。

加里

2 个答案:

答案 0 :(得分:1)

我很困惑为什么你这样做。您通常不会自己致电initWithCoder:。您向编码器询问其内容并为您创建对象。该方法的整个解码部分应为id archivedObject = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]],其中archivedObject可能是您在代码中调用newCore的数组(我不知道文件的内容,所以我'我只是猜你写的东西)。在这种情况下,你会想mutableCopy它,因为我不认为NS * Archiver会保留可变性。

我也希望你不要期望在你的NSArray未归档时,你在帖子顶部写的initWithCoder:方法被调用。

答案 1 :(得分:0)

“我也希望你不要期望你的initWithCoder:你在帖子顶部写的方法在这个NSArray被取消存档时被调用。”

没用。为什么你不能写出为什么不调用它?感谢

修改 实际上,如果数组中的对象实现NSCoding,则在恢复数组时会在每个对象上调用initWithCoding(这里的恢复意味着您调用[decoder decodeObjectForKey:@“yourArray”])。我实际上是在自己的代码中这样做的。所以我认为你写的是假的!