首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >initWithCoder:被nib & NSCoding调用!

initWithCoder:被nib & NSCoding调用!
EN

Stack Overflow用户
提问于 2011-03-05 11:34:41
回答 2查看 1.6K关注 0票数 1

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

编辑:以下是initWithCoder的代码:

代码语言:javascript
复制
- (id)initWithCoder:(NSCoder *)coder {
    [super initWithCoder:coder];
    [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    return self;
}

我所要做的就是解码一个地图视图的注解数组,但是这个方法被调用了两次,然后就崩溃了。

EN

回答 2

Stack Overflow用户

发布于 2011-03-05 21:14:25

不要忘了在init方法中加入nil检查。例如,你发布的方法如果你写成:

代码语言:javascript
复制
- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    } 
    return self;
}

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

有没有什么好的理由让你自己取消存档视图控制器?如果你没有做任何特别的事情,你可以依靠现有的机制来做。UIViewController的默认init实现查找与视图控制器同名的nib,如果存在,则(通过initWithNibName)加载nib。

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

票数 0
EN

Stack Overflow用户

发布于 2011-03-05 12:28:25

你可以试试

代码语言:javascript
复制
- (id)initWithCoder:(NSCoder *)coder {
     if(self == nil)
     {
          [super initWithCoder:coder];
          [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
     }
      return self;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5201475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档