2011-06-13 8 views
6

私はUIViewControllerサブクラスを持っており、オブジェクトインスタンスごとに1回だけ初期化コードを実行できるようにするために何をオーバーライドするかを検討しようとしています。UIViewControllerでONCEを初期化する場所

viewDidLoadメソッドが明らかな答えのように見えるかもしれませんが、コントローラがメモリ警告のためにビューをリセットした場合、viewDidLoadが複数回実行される可能性があります。 initWithNibName:bundle:init、およびinitWithCoder:の方法も良い選択のように思えますが、どちらを優先しますか? awakeFromNibメソッドは別の考慮事項ですが、それは私のView Controllerで実行されていないようです。

これを行う方法はありますか?

答えて

4

あなたはおそらくviewDidLoadを使用できますが、内部で静的ブール値を使用して、すでにそこにいたかどうかを確認できます。

static BOOL didInitialize = NO; 
if (didInitialize == YES) 
    return; 

didInitialize = YES; 
/* initialize my stuff */ 
+0

私の質問ははっきりしないと思います。私は私のオブジェクトのインスタンスを意味しましたが、同じアプローチをオブジェクト変数と一緒に使うことができます。 – chris

2

+(void)initializeについてこれは、iOSがあなたに求めているクラスイニシャライザです。一度、クラスについて理解しています。

+0

'if(self == [MyViewController class])'をチェックしてください。 –

+0

オブジェクトがnibからアンパックされたときに+(void)initializeが呼び出されますか?そうでない場合、必要な初期化が正しく行われないことがあります。 –

+0

ペン先からロードしている場合は、 ' - (void)awakeFromNib'を実装して、再構成されたオブジェクトのワンタイム設定を行うことができます。しかし、これはクラスの初期化ではありません。これは、nibオブジェクトの1回限りのセットアップのインスタンスごとです。異なる。 –

5

UIViewControllersの指定イニシャライザ、他のすべての初期化子を呼び出すことになっている方法は、-initWithNibName:bundle:です。ビューコントローラの作成時に何かを初期化する場合は、そのメソッドをオーバーライドします。

-viewDidLoadは、コントローラのビューに依存する任意のセットアップを意味します。あなたが指摘したように、ビューは複数回読み込まれる可能性があるため、そのメソッドは複数回実行される可能性があります。 -awakeFromNibは、あなたのビューコントローラ自体がペン先に存在しない場合でも、初期化しているものが同じペン先の他のオブジェクトに依存する場合にのみ意味があります。

+0

私が誤解していない場合、 '-initWithFrame:'はUIViewControllerのメソッドではないので、うまくいくとは思わない。おそらくあなたは 'initWithNibName:bundle:'を意味していたでしょうか? – chris

+0

Doh。もちろんそうです...私はUIViewを考えていましたが、UIViewControllerは考えていませんでした。私は投稿を修正します。 – Caleb

+0

この回答は正しいです。初期化コードを実行するinitメソッドは1つだけです。他のinitメソッドはそのinitメソッドを呼び出す必要があります。 –