好的,我现在遇到很多问题试图让initWithCoder:正常工作。我有一个加载的nib文件,在我的app委托中,我调用unarchiveWithFile:对于与该nib关联的视图控制器,现在我的应用程序崩溃了。我可以看到initWithCoder:被调用两次,大概是从调用awakeFromNib:时开始调用,然后从调用unarchiveWithFile开始调用:因为视图控制器符合NSCoding。但是现在要么在视图加载时或者在按下IBOutlet时崩溃。有什么建议??
编辑:这是initWithCoder的代码:
- (id)initWithCoder:(NSCoder *)coder {
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
return self;
}
我正在做的就是为地图视图解码一个注释数组,但是在这个方法的某个地方,这个方法被调用两次然后崩溃了。
不要忘记在你的init方法中加入nil检查。例如。如果你把它写成:你发布的方法会更正确:
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
}
return self;
}
但是,这不是你问题的原因。
您是否有充分理由自行取消归档视图控制器?如果你没有做任何特别的事情,你可以依靠现有的机制去做。 UIViewController的init的默认实现查找与视图控制器同名的nib,如果存在,则加载nib(通过initWithNibName)。
如果存在需要存档和存档的数据,则可能不应该是UIViewController的实际部分。也许在其他地方考虑它?
你可以试试
- (id)initWithCoder:(NSCoder *)coder {
if(self == nil)
{
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
}
return self;
}