1


Objective-C でのオブジェクトのリリースについて質問があります。「iPhone 4 開発入門」(287 ページ) の第 9 章にサンプルコードがいくつかありました。サンプル コードでは、viewDidUnload メソッドと dealloc メソッドの両方で、オブジェクトを 2 回解放します。サンプルコードは次のとおりです。

- (void)viewDidUnload {
self.list = nil;
[childController release], childController = nil;}

- (void)dealloc {
[list release];
[childController release];
[super dealloc];}

childControllerUIViewControllerサブクラスのインスタンスとして宣言されています。viewDidUnloaddeallocメソッドの両方でリリースされるのはなぜですか? childControllerはすでに viewDidUnload で解放されているのでdeallocメソッドで再度解放する必要はありますか? 私の理解に基づいて、次のようなコードを記述します。

- (void)viewDidUnload {
self.list = nil;
childController = nil;}
- (void)dealloc {
[list release];
[childController release];
[super dealloc];}

ありがとう、
サム

4

3 に答える 3

3

問題は、メソッドviewDidUnloadのように毎回呼び出されることが保証されていないことです。deallocこの質問を確認してください)。

でオブジェクトを解放する理由viewDidUnloadは、メモリ リークを避けるためです。メモリ不足の警告が発生したときに呼び出されるためviewDidUnload、その場合のトラブルを避けるためにクリーンアップする必要があります。

また、release onnilを呼び出しても問題は発生しないため、dealloc(例のように) 他の場所で解放された後にポインターが nil に設定されていると仮定すると、メソッド内の保持されたオブジェクトで release を呼び出しても安全viewDidUnloadです。

于 2011-09-02T14:24:32.007 に答える
0

利用可能なメモリを最適化するために、UIViewControllers に遅延ゲッター (実際には遅延初期化子) を実装し、viewDidUnload で簡単に再割り当て可能なオブジェクトを解放することをお勧めします。(単純化された) 遅延ゲッターは次のようなものです。

- (UIView *)footerView {
    if (_footerView) {
        return _footerView;
    }
    UIView *view = [[UIView alloc] initWithFrame:A_FRAME];
    return (_footerView = view);
}

そのため、viewDidUnloadで_footerViewを解放します。後で手間をかけずに取得できるからです。dealloc メソッドでの_footerViewの解放はエラーではありません。1) 目的 c では、nil オブジェクトにメッセージを送信しても問題ないため、2) dealloc は viewDidUnload と同時には実行されませんが後で実行されます。

于 2011-09-02T14:39:10.000 に答える
0

よくわからないのでちょっと調べてみました。そして、あなたが知る必要があるのはここだけです: -dealloc ではなく -(void)viewDidUnload でオブジェクトを解放する必要があるのはいつですか?

基本的に、viewDidUnload では、ビューのライフ サイクルの最初に作成したオブジェクトを解放します (loadView、viewDid ロードなど)。したがって、viewController がメモリ警告を受け取った場合、ビューをアンロードして再度リロードし、オブジェクトは viewDidUnload で解放され、loadView/viewDidLoad/ect で再度初期化されます。

于 2011-09-02T15:01:51.563 に答える