【问题标题】:initWithCoder: getting called by nib & NSCoding!initWithCoder:被 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”

标签: iphone archive nib nscoding


【解决方案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;
}

【讨论】:

  • 我认为这种方法是试图将粘性较差的塑料粘在伤口上,而不是固定伤口,可以这么说!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多