1

わかりました、私は今 initWithCoder: を正しく動作させようとして多くの問題を抱えています。読み込まれる nib ファイルがあり、アプリ デリゲートで、その nib に関連付けられているビュー コントローラーに対して unarchiveWithFile: を呼び出すと、アプリがクラッシュします。ビュー コントローラーが NSCoding に準拠しているため、initWithCoder: が 2 回呼び出されていることがわかります。しかし、ビューが読み込まれるとすぐにクラッシュするか、IBOutlet を押すとクラッシュします。助言がありますか??

編集: initWithCoder のコードは次のとおりです。

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

私が行っているのは、マップ ビューの注釈の配列をデコードすることだけですが、このメソッドが 2 回呼び出されてクラッシュします。

4

2 に答える 2

0

init メソッドに nil チェックを入れることを忘れないでください。たとえば、投稿したメソッドは、次のように記述した場合により正確になります。

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

ただし、それは問題の原因ではありません。

ビューコントローラーを自分で解凍する正当な理由はありますか? 特別なことをしていない場合は、既存のメカニズムに頼ることができます。UIViewController の init のデフォルトの実装は、View Controller と同じ名前の nib を探し、存在する場合は (initWithNibName を介して) nib をロードします。

アーカイブする必要があるデータがある場合、それは実際には 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 に答える