Gemäß der Dokumentation von Apple instanziiert Interface Builder Objekte, die dann zur Entwurfszeit serialisiert und in eine NIB/XIB-Datei verpackt werden. Zur Laufzeit wird der gesamte Objektgraph über initWithCoder: deserialisiert.
Hier ist die Dokumentation:
View-Instanzen, die in Interface Builder erstellt werden, rufen nicht initWithFrame: auf, wenn ihre NIB-Dateien geladen werden, was oft zu Verwirrung führt. Bedenken Sie, dass Interface Builder ein Objekt archiviert, wenn es eine NIB-Datei speichert, sodass die View-Instanz bereits erstellt wurde und initWithFrame: bereits aufgerufen wurde.
Da die Objekte über initWithCoder: instanziiert werden, dachte ich, dass der Objektgraph über sein Gegenstück encodeWithCoder: serialisiert wird. Betrachten Sie jedoch den folgenden Code:
@interface CustomView : UIView
@end
@implementation CustomView
-(id)initWithCoder:(NSCoder *)aDecoder{
if(self = [super initWithCoder:aDecoder]){
NSNumber * n = [aDecoder decodeObjectForKey:@"DummyKey"];
NSLog(@"%@", n);
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:@YES forKey:@"DummyKey"];
}
@end
Wenn ich dieses CustomView in einem Storyboard in Interface Builder platziere, wird "(null)" anstelle von "YES" gedruckt. Warum passiert das? Wie serialisiert Interface Builder den Objektgraph? Habe ich die Dokumentation falsch interpretiert?