2013-03-19 16 views
30

初期ビューコントローラがロードされていて、awakeFromNibメソッドまたはinitWithCoder:メソッドでこれを処理する必要がある場合、NSArrayをinitする必要がありますか?私は何も返す必要はないので、awakeFromNibはもっとうまくいくように思えますが、nibファイルは正しく使用されていたものとして機能しますか?私はすぐに壊れる方法を使用したくありません。ここでawakeFromNibまたはinitWithCoderを使用しますか?

そしてinitWithCoder:だけのようになります。

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

    return self; 
} 

答えて

38

-awakeFromNibのポイントは、あなたがペン先の他のオブジェクトへのすべての接続が確立されていることを確認することができたときには、initのものを行うことができるということです。

ニブローディング・インフラストラクチャは、ペン先のアーカイブから再作成各 オブジェクトにawakeFromNibメッセージを送信するが、 アーカイブ内のすべてのオブジェクトがロードされ、初期化された後にのみ。オブジェクトが awakeFromNibメッセージを受信すると、すべてのコンセントと アクション接続が既に確立されていることが保証されます。

superを忘れてはいけません。

すぐには外に出ることはまずありません。コードがあまりにも長すぎると、移行期間が長くなることがあります。はい、その名前は古い "nib"ファイル形式に由来しますが、this stack overflow questionはファイル拡張子の違いを解消します。

要約すると、クラスの内部インスタンス変数を設定しているので、どちらの方法でも機能します。 initのメソッド(-initWithCoderを含む)では、セッターがクラスを完全に初期化することに頼っている場合(WWDC 2012のビデオソースが現代のobjective-cに移行している場合)にセッターメソッドを使用することは安全でない場合があります。たとえば、nibファイル内の別のオブジェクトを参照するプロパティを設定する例があります。

UIViewControllerサブクラス-initWithCoderは、ストーリーボードからロードするときにのみ呼び出されます。あなたがストーリーボードを使用するかどうかにかかわらず、-awakeFromNibが呼び出されるかどうかは、それを使用する方がより合理的かもしれません。あなたが考えることができ

もう一つのパターンは、怠惰なゲッターである:

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

このアプローチの利点は、アレイに、さらにセットアップをやってみたかった場合にはそうでないときに簡単に配列を破棄することができるということですもうそれを必要とし、次回に新しい物件を持っている物件にアクセスするときに。

+1

素晴らしいですが、 '-initWithCoder:'はUIViewControllerで呼び出されません。 – CodaFi

+4

ストーリーボードからインスタンス化されたUIViewControllerサブクラスの 'initWithCoder'メソッドにブレークポイントを設定し、デバッガがブレークポイントにヒットしました。 [The docs](http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10)はこの動作を確認します。 – Jeff

+0

どちらの方法でも、ストーリーボードからロードするときに '-awakeFromNib'も得られます。 – jackslash

関連する問題