iPhone Plusの横向き起動について

iPhone Plusではアプリを横向きで起動できます。ところが、独自の回転処理を挟んでいる場合でも起動時には呼ばれません。これらのメソッドはあくまでも回転を検知した場合だけ呼ばれるようです。

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

起動時も画面の向きに応じた処理をしたい場合にはviewDidLoadで呼んでおきましょう。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self willTransitionToTraitCollection:self.traitCollection withTransitionCoordinator:self.transitionCoordinator];
}

viewWillAppearならナビゲーションからプッシュされた時だけ呼ぶ事も出来ます。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if ([self isMovingToParentViewController]) {
        [self willTransitionToTraitCollection:self.traitCollection withTransitionCoordinator:self.transitionCoordinator];
    }
}

起動時以外は問題なく回転を検知して呼んでくれます。

向きを変えて元の画面に戻った時の元の画面の挙動。
willTransitionToTraitCollection => viewWillAppear => viewDidAppear

閉じた状態で向きを変えて再アクティブにした時。
willTransitionToTraitCollection => applicationWillEnterForeground => applicationDidBecomeActive

iOS 11にて確認

NSStringオブジェクトの==比較について

// テスト1
NSString *a = [NSString stringWithString:@"STR"];
NSString *b = [NSString stringWithFormat:@"%@", @"STR"];
NSLog(@"aとbは%@", a == b ? @"同じ" : @"違う");

// テスト2
NSString *a = [NSString stringWithString:@"STR"];
NSString *b = @"STR";
NSLog(@"aとbは%@", a == b ? @"同じ" : @"違う");

テスト1は同じ、テスト2は違う
CFGetRetainCountでリファレンスカウントしてみると、テスト2のbは開放不要になってますね。