initWithCoder:被 nib 和 NSCoding 调用!
Posted
技术标签:
【中文标题】initWithCoder:被 nib 和 NSCoding 调用!【英文标题】:initWithCoder: getting called by nib & NSCoding! 【发布时间】:2011-03-05 03:34:40 【问题描述】:好的,我现在遇到很多问题,试图让 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;
我所做的只是为地图视图解码一组注释,但是在某个地方,这个方法被调用了两次,然后它就崩溃了。
【问题讨论】:
现在我得到的只是调试器说“EXC_BAD_ACCESS” 【参考方案1】:不要忘记在你的 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 的一部分。也许在其他地方考虑?
【讨论】:
很高兴能得到一些关于为什么不赞成票的反馈。 我不知道为什么这被否决了,但谢谢你,我将尝试在其他地方考虑它。 这并不是一个直接的答案。应该是评论吧。这可能就是它被否决的原因。【参考方案2】:你可以试试
- (id)initWithCoder:(NSCoder *)coder
if(self == nil)
[super initWithCoder:coder];
[[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
return self;
【讨论】:
我认为这种方法是试图将粘性较差的塑料粘在伤口上,而不是固定伤口,可以这么说!以上是关于initWithCoder:被 nib 和 NSCoding 调用!的主要内容,如果未能解决你的问题,请参考以下文章
init&initWithFrame&initWithCoder
我应该在这里使用awakeFromNib还是initWithCoder?
来自笔尖的 NSWindowController 子类初始化不使用 -initWithCoder:?