开发者

initWithCoder not working as expected?

开发者 https://www.devze.com 2022-12-23 03:42 出处:网络
Does this seem right, the dataFilePath is on disk and contains the right data, but the MSMutable array does not contain any objects after the initWithCoder? I am probably just missing something, but I

Does this seem right, the dataFilePath is on disk and contains the right data, but the MSMutable array does not contain any objects after the initWithCoder? I am probably just missing something, but I wanted to quickly check here before moving on.

-(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 re开发者_如何学JAVAlease];
        } else {
            NSMutableArray *newCore = [[NSMutableArray alloc] init];
            [self setReactorCore:newCore];
            [newCore release];
        }
    }
    return self;
}

EDIT_001

I think I know where I am going wrong, I am archiving NSData and then trying to initialise my NSMutable array with it. I will rework the code and post back with an update.

gary


I am confused as to why you're doing things this way. You do not normally call initWithCoder: yourself. You ask the coder for its contents and it creates the objects for you. The whole decoding part of that method should be id archivedObject = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]], where archivedObject is presumably the array you call newCore in your code (I don't know the contents of the file, so I'm just guessing from what you wrote). In that case, you'll want to mutableCopy it, since I don't think NS*Archiver preserves mutability.

I also hope you aren't expecting your initWithCoder: method that you wrote at the top of your post to be called when this NSArray is unarchived.


"I also hope you aren't expecting your initWithCoder: method that you wrote at the top of your post to be called when this NSArray is unarchived."

is not useful. Why can't you write why it's not called? Thanks

EDIT: In fact, if the objects in your array implement NSCoding, initWithCoding is called on each of them when you restore your array (restore here means that you call [decoder decodeObjectForKey:@"yourArray"]). I'm actually doing this in my own code. So I think what you wrote is false!

0

精彩评论

暂无评论...
验证码 换一张
取 消