いや、考えれば当たり前なんですが、眠気と闘いながら書いてたりすると、背景色とかinitで設定しちゃってたり…。
例えば以下のようにAppDelegateからViewControllerを設定しているとします。
AppDelegate.m
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; NSLog(@"AppDelegate - (1)"); ViewController *controller = ViewController.new; NSLog(@"AppDelegate - (2)"); self.window.rootViewController = controller; [self.window makeKeyAndVisible]; NSLog(@"AppDelegate - (3)"); return YES; } |
こちらが問題のないViewController。
(問題のない)ViewController.m
|
- (id)init { if (self = [super init]) { NSLog(@"ViewController - (I)"); } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"ViewController - (II)"); } |
出力されるログは以下のように、(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
|
- (id)init { if (self = [super init]) { NSLog(@"ViewController - (I)"); self.view.backgroundColor = UIColor.grayColor; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"ViewController - (II)"); } |
ログが(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が読み込まれてしまい、発生した差異です。
多くの場合、問題は起きないと思いますが、いざハマると解決に時間がかかりそうな気がします。
気をつけよう…。
最近のコメント