0

以下のコード スニペットの違いを理解してもらえますか。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    // Custom initialization

    }  
    return self; 
}

-(id)initWithCoder:(NSCoder *)decoder

Apple のドキュメントには、ストーリーボードからビュー コントローラーをインスタンス化するときに initWithCoder を使用すると記載されています。誰かが initWithCoder メソッドを使用してビュー コントローラーを開始するサンプル コードを記述してください。

私は実際にはiosプログラミングが初めてなので、違いを知りたいだけです。

ありがとう!!

4

2 に答える 2

0

通常、IB(nibまたはストーリーボード)から作成されるたびに呼び出されますが、オブジェクトがアーカイブまたはシリアル化されるときにも呼び出されます(NSUnarchiverを参照)。

実装に関しては、次のように扱うことができます-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilただし、追加のパラメーターをスーパーに渡すことを確認する必要がありますあなたがそれを呼ぶときのクラス:

- (id)initWithCoder:(NSCoder*) coder
{
    self = [super initWithCoder: coder];
    if (self) {
        // do your setup here.
    }
    return self;
}

おそらくこれを呼び出すことはないでしょうが、nibに埋め込まれたカスタムクラス/ビューを使用すると、InterfaceBuilderが呼び出します。コードで初期化する場合は、initWithNibNameを使用する必要があります。

于 2012-07-13T23:46:25.640 に答える
0

最も重要な違いは、VC がストーリーボードからプルされるときに initWithCoder: が呼び出され、initWithNibName は呼び出されないことです。すべての意図と目的のために、WithCoder:ビットを無視できます (に渡す場合を除く[super initWithCoder:decoder])。このメソッドは、Cocoa のオブジェクト アーカイブ/シリアル化ライブラリの一部であり、インスタンス化されたオブジェクトをアーカイブ/アーカイブ解除する必要がある場合に使用されます。

このように考えると役に立ちます。ViewController は、Xcode でアプリをビルドするときに実際にインスタンス化および初期化され、ストーリーボードにアーカイブされます。その後、実行時にストーリーボードはアーカイブのように扱われ、ジョブは従来の初期化よりも「アーカイブからの再初期化」に似ています。

于 2012-07-13T23:25:05.383 に答える