1

好的,我现在有很多问题试图让 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;
}

我所做的只是为地图视图解码一组注释,但是在某个地方,这个方法被调用了两次,然后它就崩溃了。

4

2 回答 2

0

不要忘记将 nil 检查放在您的 init 方法中。例如,如果您将其编写为,您发布的方法会更正确:

- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    } 
    return self;
}

然而,这不是你的问题的原因。

您是否有充分的理由自行取消归档视图控制器?如果你没有做任何特别的事情,你可以依靠现有的机制来做。UIViewController 的 init 的默认实现会查找与视图控制器同名的 nib,如果存在,它会加载 nib(通过 initWithNibName)。

如果有数据需要归档进出,它可能实际上不应该是 UIViewController 的一部分。也许在其他地方考虑?

于 2011-03-05T13:14:24.907 回答
-1

你可以试试

- (id)initWithCoder:(NSCoder *)coder {
     if(self == nil)
     {
          [super initWithCoder:coder];
          [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
     }
      return self;
}
于 2011-03-05T04:28:25.293 回答