fuzzygoat
fuzzygoat

Reputation: 26223

initWithCoder not working as expected?

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 release];
        } 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

Upvotes: 0

Views: 2065

Answers (2)

Matt N.
Matt N.

Reputation: 1239

"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!

Upvotes: 0

Chuck
Chuck

Reputation: 237060

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.

Upvotes: 1

Related Questions