好的,我现在遇到很多问题试图获得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;
}
我正在做的就是为地图视图解码一个注释数组,但是在这个行的某个地方,这个方法被调用了两次然后就崩溃了。
答案 0 :(得分:0)
不要忘记在你的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的实际部分。可能会把它排除在其他地方吗?
答案 1 :(得分:-1)
你可以尝试
- (id)initWithCoder:(NSCoder *)coder {
if(self == nil)
{
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
}
return self;
}