1

古いコードを調べて、見つけにくいバグを検出しようとしています。コントローラーが割り当てられ、プロパティに格納され、そのビューがコントローラー全体を表示する代わりにサブビューとして追加されるという、UIViewController の異常な使用法に遭遇しました。

私はこれが一種のハッキーで異常であることを知っていると言うことから始めましょう. とはいえ、次の実装にはどのような危険がありますか? これが引き起こす可能性のある予期しない副作用はありますか? ビューをアンロードしてMyOtherViewController、ある時点でメモリ警告を受け取ったために再作成すると、奇妙な動作が発生する可能性がありますか?

@interface MyViewController()
@property (nonatomic, strong) MyOtherViewController *otherVC;
@end

@implementation MyViewController

- (void)viewDidLoad
{
    self.otherVC = [[MyOtherViewController alloc] init];
    [self.view addSubview:self.otherVC.view];
}

@end
4

3 に答える 3

2

あなたがしていることは、カスタム ビュー コントローラー コンテナーを作成することです。これは悪いことではありませんが、本来の方法で行っていません。UIViewController のクラス リファレンスには、何をしようとしているのかを正確に説明するセクションがあります。

于 2013-10-28T21:03:03.427 に答える
1

View Controllers Contentsをプログラムで表示するをご覧ください

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingViewControllersinYourApplication/UsingViewControllersinYourApplication.html#//apple_ref/doc/uid/TP40007457-CH6-SW8

これに注意してください: 重要: ビュー コントローラーのビューをビュー階層に直接インストールしないでください。

于 2013-10-28T21:48:45.887 に答える
0

移動先のプロジェクトで厄介な BAD EXEC クラッシュを追跡しました (以下の厄介なバグを参照)。

UIViewController を使用することは非常に悪いと言えます。

  • コントローラーの割り当てが解除されていないことを確認する必要があります。スーパービューのあるビュー階層にあるため、ビューは表示されませんが、コントローラーにはそれを保持するオブジェクトがありません。ウィンドウに rootController、タブ コントローラー、ナビゲーション コントローラーとして追加された場合、または別のコントローラーによって提示された場合 (通常の使用法) は問題ありません。

  • viewDidLoad 以外に呼び出されると予想される向きの変更やメッセージは受信しません。

  • 厄介なバグ。たとえば、iOS 5 では、モーダル コントローラーを閉じる前にこのコントローラーの割り当てを解除しないと、BAD EXEC クラッシュが発生し、気が狂ってしまいます。SDK のアニメーション メソッドは、モーダル アニメーションの終了中にビュー コントローラーが存在することを期待しているようです。

于 2013-12-04T06:17:05.900 に答える