1

私のiPhoneアプリは、Apple独自のWeatherアプリのような一般的な「ユーティリティテンプレート」に基づいています。

情報ボタンをクリックすると、画面が反転します。完了ボタンをクリックすると...元に戻ります。その部分はすべて問題なく機能しているようです。

NSLog()ステートメントをFlipSideViewController.mの4つのメソッドのそれぞれに配置しました

viewDidLoad
viewWillAppear
viewDidUnload
viewWillDisappear

FlipSideに切り替えたときに、viewDidLoadとviewDidAppearが呼び出されるのを見る必要はありません。そして、私が戻ったときにviewWillDisappearとviewDidUnloadを参照してください?

代わりに、viewDidUnload呼び出しは表示されません。ただし、FlipSideに切り替えるたびに、別のviewDidLoadが表示されます。それは間違っていますか?

何度も何度も前後にめくって、私は見るでしょう:

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

これは、ビューが3回リロードされたが、0回アンロードされたことを意味しませんか?ここで「一致する」ロード/アンロードメソッドと表示/非表示メソッドが発生するべきではありませんか?

4

1 に答える 1

7

私も最初はそう思っていたのですが、どうやらそうではないようです。

このviewDidUnloadメソッドは実際には、View Controller がメモリ警告を受け取ったときにのみ呼び出されます。

それにもかかわらず、View Controller の割り当てが解除されると、View は解放されます。

したがって、IB アウトレットのようなものを でリリースするのは良いことですが、通常の状況 (つまり、メモリ警告が表示されない場合) では呼び出されないため、 でviewDidUnloadそれらもリリースする必要があります。deallocviewDidUnload

編集: を解放するには、あなたのスーパークラスviewを呼び出すだけです:deallocUIViewControllerdealloc

- (void) dealloc
{
    // release your stuff, anything that you alloc or retain in your class

    // then call `dealloc` on the super class:
    [super dealloc];
}

メソッドではviewDidUnload、ビューとともにアンロードする必要があるもの、通常IBOutletはインターフェイス ビルダーで s に接続したものだけを解放する必要があります。

- (void) viewDidUnload
{
    // if the property was declared with the "retain" keyword, you can
    // release it simply by setting it to nil like this:
    self.myOutlet = nil;
}
于 2010-11-29T18:19:45.430 に答える