2

Xcode 4.3.2で、空のアプリテンプレートを使用して新しいiOSプロジェクトが作成された場合、次のようになりAppDelegate.mます。

self.window.rootViewController = [[FooViewController alloc] init];

およびFooViewController'sviewDidLoadでは、次のようになります。

NSLog(@"self.view is %p", self.view);
NSLog(@"self.view is %@", self.view);

ビューを印刷するので、デフォルトでloadViewはビューがインスタンス化されてに割り当てられるように見えますself.view

したがってloadView、すべて空のメソッドでオーバーライドし、上記の2番目のステートメントをコメントアウトするとNSLog、最初のNSLogステートメントが出力されると思います0x0が、その代わりに、その行でのメモリアクセスが悪いためにアプリがクラッシュしましたNSLog。なぜそうなるのでしょうか?

4

2 に答える 2

5

さて、ひざまずいて明らかに間違った答えをした後、私はこれを試しました。空のアプリテンプレートにはrootViewControllerがないため、単一の画面テンプレートを使用しました。実行後、スタックオーバーフローが発生していることがわかります。self.viewにアクセスしようとすると、スーパークラスのviewプロパティを呼び出し、スーパークラスはビューを返すためにビューをロードしようとします。これは、私が見る限り、viewDidLoadなどを呼び出します。他のNSLogステートメントも同じことをします。

于 2012-05-24T19:58:08.013 に答える
2

州のviewプロパティUIViewControllerのドキュメント:

このプロパティにアクセスすると、ビューが自動的に読み込まれる可能性があるため、このisViewLoadedメソッドを使用して、ビューが現在メモリ内にあるかどうかを判断できます。

また、 ViewControllerのライフサイクルへのリンクもあります。

ロードサイクル中に発生する手順は次のとおりです。

  1. ロードサイクルは、ビューコントローラのviewプロパティにアクセスし、ビューが現在メモリにない場合にトリガーされます。

  2. ビューコントローラはそのloadViewメソッドを呼び出します。メソッドのデフォルトの実装は、loadView次の2つのいずれかを実行します。

    • ビューコントローラがストーリーボードに関連付けられている場合、ストーリーボードからビューをロードします。

    • ビューコントローラがストーリーボードに関連付けられていない場合、空のUIViewオブジェクトが作成され、プロパティに割り当てられviewます。

  3. ビューコントローラはそのviewDidLoadメソッドを呼び出して、サブクラスが追加のロード時タスクを実行できるようにします。

だからあなたが言うとき:

したがってloadView、すべて空のメソッドでオーバーライドすると、

loadViewオーバーライドされたバージョンが終了すると、ビューが読み込まれるはずなので、意図的にライフサイクルを中断しています。そうではなかったので、あなたはクラッシュします。

于 2012-05-24T20:08:41.767 に答える