日々精進

新しく学んだことを書き留めていきます

initメソッドとviewDidLoadの使い分けについて

viewControllerを初期化する場合、initで始まるメソッドとviewDidLoadメソッド内で初期化することが多い。
これらの違いは以下。
○initメソッド
・呼ばれるタイミング
自分でinitを読んだとき
XIBファイル内にコントローラがある場合はそのファイルをinitWithNibNameで指定したviewControllerのviewDidLoadメソッドが実行されたとき。initWithCoderが実行される。
・何を初期化するべきか
viewでないインスタンス変数
○viewDidLoad
・呼ばれるタイミング
viewControllerのオブジェクトのviewプロパティが初めて呼ばれたとき
メモリ不足シグナルをシステムから受け取ってviewを破棄した後、再度viewプロパティが呼ばれたとき
・何を初期化するべきか
viewの設定


○コードを書いているときに注意すべきこと
initメソッド内ではself.viewにアクセスしてはいけない。
viewDidLoad内ではself.viewなどのviewインスタンス変数以外のインスタンス変数(正確にはXIBまたはloadViewメソッドインスタンスが代入される変数)を初期化してはいけない。


○理由
initメソッド内でviewを初期化すると、メモリ警告が発生してviewが破棄された場合initメソッド内の初期化コードが実行されないためviewの設定がおかしくなる。
viewDidLoadメソッド内でview以外のインスタンス変数を初期化するとメモリ警告後に再度viewDidLoadが実行された場合に意図せずインスタンス変数が初期化されてしまう。