1

私はビューベースのアプリケーションを持っていて、dealloc メソッドが機能しているかどうかを確認したところ、それが機能していないことがわかりました...デバッグとデバッグを行った後、retainCount を使用すると、プログラムの開始時にビューコントローラーの保持カウントがおかしくなっていることがわかりました...簡単に再現....

新しいビュー ベースのアプリケーション テンプレートを開始し、didFinishLaunchingWithOptions で:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after app launch. 
 NSLog(@"i1 %i",[viewController retainCount]);
    [window addSubview:viewController.view];
 NSLog(@"i2 %i",[viewController retainCount]);
    [window makeKeyAndVisible];

 return YES;
}

私はコンソールに乗りました:

[Session started at 2010-08-07 09:57:34 -0300.]
2010-08-07 09:57:35.132 teste1[20367:207] i1 2
2010-08-07 09:57:35.138 teste1[20367:207] i2 8

これは正しいですか?

次に、iPhoneのホームボタンを押してアプリを閉じると、deallocメソッドが呼び出されません.viewControllerのretainCount....私は正しいですか?

これは、アップルのビュー アプリケーション テンプレートです...動作するはずです...そうではないですか?

最初の保持カウントが2である理由を誰かが説明できますか????? そして他の8??? xibファイルは空です....

4

2 に答える 2

2

メモリ管理ルールに従っている限り、オブジェクトの実際の保持数について心配する必要はありません。フレームワークはオブジェクトを保持または解放する可能性があるため、保持カウントは制御不能になります。

于 2010-08-07T13:03:38.487 に答える
1

アプリを終了するときに、dealloc が呼び出されない場合があります。これはテストする方法ではありません。また、ルート ビュー コントローラーは常にアプリに存在します。自分で作成した他のクラスに注意し、(終了時ではなく) 呼び出される予定のときにそれらの dealloc が呼び出されていることを確認する必要があります。また、retainCount に依存しないでください。Apple は、どこにも使用しないことを推奨しています。

2 つのビューと、ルート ビュー コントローラー以外の対応するビュー コントローラーがあるとします。最初のビューでは、他のオブジェクトを作成しました。2 番目のビューに切り替えるとき、1 番目のビューが必要でない場合は、1 番目のビュー用にメモリを解放する必要があります。この場合、最初のビューのオブジェクトが実際に割り当て解除されていることをテストする必要があります。このようにコーディングしても呼び出されない場合は、リークがあるはずです。ただし、アプリの終了時にこれをテストしないでください。

于 2010-08-07T16:37:57.073 に答える