36

私の最初のView Controllerが読み込まれ、NSArrayを初期化する必要があります.awakeFromNibメソッドまたはメソッドでこれを処理する必要がありinitWithCoder:ますか? awakeFromNib は、何も返す必要がないため、より適切に機能するようですが、以前は正しく使用されていた nib ファイルとして機能しますか? すぐ壊れるメソッドは使いたくない。

そして、initWithCoder:次のようになります。

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super initWithCoder:decoder]) {
        self.articles = [[NSMutableArray alloc] init];
    }

    return self;
}
4

1 に答える 1

51

要点は-awakeFromNib、ペン先内の他のオブジェクトへのすべての接続が確立されていることを確認できるときに、init を実行できるようにすることです。

nib 読み込みインフラストラクチャは、アーカイブ内のすべてのオブジェクトが読み込まれて初期化された後にのみ、nib アーカイブから再作成された各オブジェクトに awakeFromNib メッセージを送信します。オブジェクトが awakeFromNib メッセージを受信すると、すべてのアウトレットとアクション接続がすでに確立されていることが保証されます。

電話することを忘れないでくださいsuper

すぐになくなる可能性は低く、多くのコードで使用されている場合は、移行期間が長くなるでしょう。はい、その名前は古い「nib」ファイル形式に由来しますが、このスタックオーバーフローの質問はファイル拡張子の違いを解決します.

要約すると、クラスの内部インスタンス変数を設定しているため、どちらの方法でも機能します。セッターが完全に初期化されているクラスに依存している場合、セッターinitメソッド ( を含む)内でセッター メソッドを使用するのは安全ではない可能性があることに注意してください (ソース WWDC 2012 ビデオは最新の Objective-C に移行しています)。-initWithCoder例としては、nib ファイル内の別のオブジェクトを参照するプロパティを設定することがあります。

In UIViewControllersubclasses-initWithCoderは、ストーリーボードからロードするときにのみ呼び出されます。-awakeFromNibストーリーボードを使用するかどうかと呼ばれるように、それを使用する方が理にかなっています。

考えられるもう 1 つのパターンは、レイジーゲッターです。

- (NSMutableArray *)articles{
    if (_articles){
        return _articles;
    }
    _articles = [[NSMutableArray alloc] init];
    return _articles;
}

このアプローチの利点は、配列をさらに設定したい場合に、配列が不要になったときに配列を簡単に破棄できることです。次にプロパティにアクセスすると、新しい配列が再び得られます。

于 2013-03-19T19:03:13.710 に答える