2011-03-05 105 views
1

好吧,我现在有很多问题,现在试图让initWithCoder:工作正确。我有一个被加载的nib文件,在我的应用程序委托中,我调用了unarchiveWithFile:与该nib相关联的视图控制器,现在我的应用程序崩溃了。我可以看到initWithCoder:被调用两次,大概是从awakeFromNib:被调用一次,然后从我调用unarchiveWithFile开始:因为视图控制器符合NSCoding。但是现在无论是视图加载还是按IBOutlet时都会崩溃。有什么建议么??initWithCoder:被nib和NSCoding调用!

编辑:下面是的initWithCoder代码:

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

我做的是解码注释的地图视图中的数组,但某处沿线此方法被调用两次,然后崩溃。

+0

错误日志说什么? – Jensen2k 2011-03-05 03:38:13

+0

现在我所得到的是调试器说“EXC_BAD_ACCESS” – evanskis 2011-03-05 03:40:03

回答

0

你可以尝试

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

我不知道这是否会工作。

+0

我认为这种方法试图在伤口粘上一个可怜的坚挺塑料,而不是修复伤口,可以这么说! – occulus 2011-03-05 13:02:17

1

不要忘记把你的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的实际组成部分。也许在别处分解它?

+0

很高兴得到关于为什么downvotes的一些反馈。 – occulus 2011-03-05 15:45:23

+0

我不知道为什么这会被拒绝,但是谢谢你,我会试着把它分解出去。 – evanskis 2011-03-05 16:42:00