UIViewControllerのinitではviewをいじらない方が良い

Pocket

いや、考えれば当たり前なんですが、眠気と闘いながら書いてたりすると、背景色とかinitで設定しちゃってたり…。

例えば以下のようにAppDelegateからViewControllerを設定しているとします。

AppDelegate.m

こちらが問題のないViewController。

(問題のない)ViewController.m

出力されるログは以下のように、(1)-(I)-(2)-(II)-(3)の順になり、想定通りです。

2014-05-17 14:46:56.865 init[1497:60b] AppDelegate – (1)
2014-05-17 14:46:56.867 init[1497:60b] ViewController – (I)
2014-05-17 14:46:56.867 init[1497:60b] AppDelegate – (2)
2014-05-17 14:46:56.868 init[1497:60b] ViewController – (II)
2014-05-17 14:46:56.870 init[1497:60b] AppDelegate – (3)

次に問題のあるViewControllerの場合。initでself.view.backgroundColorを操作しています。

(問題のある)ViewController.m

ログが(1)-(I)-(II)-(2)-(3)の順で出力され、先ほどの例と変わってしまっています。

2014-05-17 14:49:21.885 init[1516:60b] AppDelegate – (1)
2014-05-17 14:49:21.886 init[1516:60b] ViewController – (I)
2014-05-17 14:49:21.887 init[1516:60b] ViewController – (II)
2014-05-17 14:49:21.887 init[1516:60b] AppDelegate – (2)
2014-05-17 14:49:21.889 init[1516:60b] AppDelegate – (3)

これは、init内でself.viewにアクセスしたことにより、そこでviewが読み込まれてしまい、発生した差異です。

多くの場合、問題は起きないと思いますが、いざハマると解決に時間がかかりそうな気がします。

気をつけよう…。


コメントを残す

Your email address will not be published. Please enter your name, email and a comment.