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:?

覆盖 initWithCoder 时的无限循环

如何在 UIView 的子类中同时覆盖 initWithFrame: 和 initWithCoder:?

我应该在这里使用 awakeFromNib 还是 initWithCoder ?