initWithCoder:被nib& NSCoding!

时间:2011-03-05 03:34:41

标签: iphone archive nib nscoding

好的,我现在遇到很多问题试图获得initWithCoder:正常工作。我有一个加载的nib文件,在我的app委托中,我调用unarchiveWithFile:对于与该nib关联的视图控制器,现在我的应用程序崩溃了。我可以看到initWithCoder:被调用两次,大概是从调用awakeFromNib:时开始调用,然后从调用unarchiveWithFile开始调用:因为视图控制器符合NSCoding。但是现在要么在视图加载时或者在按下IBOutlet时崩溃。有什么建议??

编辑:这是initWithCoder的代码:

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

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

2 个答案:

答案 0 :(得分:0)

不要忘记在你的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的实际部分。可能会把它排除在其他地方吗?

答案 1 :(得分:-1)

你可以尝试

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