好的,我现在在尝试让initWithCoder正常工作时遇到了很多问题。我加载了一个nib文件,在我的应用程序委托中,我为与该nib相关联的视图控制器调用unarchiveWithFile:,现在我的应用程序崩溃了。我可以看到initWithCoder:被调用了两次,大概是在调用awakeFromNib:时调用一次,然后在我调用unarchiveWithFile:时调用一次,因为视图控制器符合NSCoding。但现在,它要么在视图加载后立即崩溃,要么在我按下IBOutlet时崩溃。有什么建议吗?
编辑:以下是initWithCoder的代码:
- (id)initWithCoder:(NSCoder *)coder {
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
return self;
}我所要做的就是解码一个地图视图的注解数组,但是这个方法被调用了两次,然后就崩溃了。
发布于 2011-03-05 21:14:25
不要忘了在init方法中加入nil检查。例如,你发布的方法如果你写成:
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
}
return self;
}然而,这并不是问题的原因。
有没有什么好的理由让你自己取消存档视图控制器?如果你没有做任何特别的事情,你可以依靠现有的机制来做。UIViewController的默认init实现查找与视图控制器同名的nib,如果存在,则(通过initWithNibName)加载nib。
如果有数据需要归档进归档和归档出,可能它实际上不应该是UIViewController的一部分。也许在其他地方会有影响?
发布于 2011-03-05 12:28:25
你可以试试
- (id)initWithCoder:(NSCoder *)coder {
if(self == nil)
{
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
}
return self;
}https://stackoverflow.com/questions/5201475
复制相似问题