initWithCoder: getting called by nib & NSCoding!-Collection of common programming errors

Don’t forget to put the nil check in your init methods. E.g. the method you posted would be more correct if you wrote it as:

- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    } 
    return self;
}

That’s not the cause of your problem, however.

Is there are good reason for you unarchiving your view controller yourself? If you’re not doing anything special, you can rely on the existing mechanisms to do it. The default implementation of init for a UIViewController looks for a nib with the same name as your view controller, and if it exists, it loads the nib (via initWithNibName).

If there is data which you need to archive in and out, it may be that it shouldn’t be actually part of the UIViewController. Factor it out elsewhere perhaps?