0

私は&で構成されるUINavigationControllerオブジェクト ( という名前) を持っています。私の iPad アプリは、サブクラス ( という名前) をロードすることから始まり、その上にモーダルに表示します (これは、AppDelegate のメソッドで次のように行われます:LoginNavViewController1ViewController2UISplitViewControllermainSplitViewControllerLoginNavdidFinishLaunchingWithOptions

[self.mainSplitViewController presentModalViewController:LoginNav animated:YES];)。

ViewController1が表示されたら、その中の a をタップUIButtonして を押しますViewController2。作業が終了したら、その中ViewController2の a をタップしUIButtonて呼び出し、ビュー コントローラーと表示コンテンツの両方で[self.navigationController dismissModalViewControllerAnimated:YES];閉じます。LoginNavmainSplitViewController's

どちらにも& withステートメントdeallocの両方にメソッドがあり、一度却下されると決して解雇されませんが、&を実行した直後に両方を発射します。ViewController1ViewController2NSLogloginNavNSLogs[self.navigationController.viewControllers objectAtIndex:0] release];[self.navigationController.viewControllers objectAtIndex:1] release];[self.navigationController dismissModalViewControllerAnimated:YES];NSLogs

上記の 2 つのリリース ステートメントをコメント アウトしてから、Allocations楽器を起動し、アプリを再度起動して、上記のようにプッシュしてから閉じ、列 (All Allocations value ) を見て、それはのViewController2却下の直後でした。次に、この手順を実行しました。繰り返しますが、この場合は 2 つの release ステートメントを使用して、列の値を正確に取得しました。loginNavLive Bytes6.9 MBloginNav6.9 MBLive Bytes

2 つの質問:

1) &のdeallocメソッドは、それらを保持しているナビゲーション コントローラが破棄された後に起動されないのはなぜですか? これらのView Controllerを解放するために上記の2つのリリースステートメントを実行するのは正しいですか?ViewController1ViewController2LoginNav

2) なぜ解放ViewController1&ViewController2はメモリを解放しないのですか?

ps単一の変数はありません(またはIBOutlet)両方でメモリに保持されViewController1& ViewController2、両方ですべてが解放されます。

4

3 に答える 3

1

この種の問題は、すべてのコードを確認せずにトラブルシューティングすることはほぼ不可能です。メモリを手動で管理する場合、問題が発生する可能性のある領域が複数あります。たとえば、次のコードはリークします。

- (void)didSelectSomethingInViewControllerOne
{
    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [self.navigationController pushViewController:vc2 animated:YES];
}

この場合、オブジェクトを割り当てたので、その所有権を持っています。次に、nav コントローラーがその所有権を取得します。コントローラーをナビゲーション スタックからポップすると、ナビゲーション コントローラーはその所有権を放棄しますが、あなたはそうしなかったため、保持カウントは 1 のままであり、割り当ては解除されません。

コードの後半 (モーダル ビューを閉じた後など) にコントローラーの所有権を放棄することは、悪い考えです。リリースがいたるところにあると、所有権を分析することが難しくなります。ナビゲーション コントローラーが所有権を取得するとすぐに、割り当てたオブジェクトを解放できます。これは将来使用する予定がないためです。

- (void)didSelectSomethingInViewControllerOne
{
    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [self.navigationController pushViewController:vc2 animated:YES];
    [vc2 release];
}

上記の状況は、問題とは関係ありません。問題はさまざまな領域に存在する可能性があります。これが、メモリ管理の問題のトラブルシューティングが難しい理由です。ソースコードを見ずに。

于 2012-06-05T15:49:34.487 に答える
0

プロジェクトを ARC に移行することを検討してください。

http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-06-05T14:31:13.513 に答える
0

もう 1 つ問題に陥った可能性があるのは、LoginNav の保持プロパティ (デリゲートなど) です。

于 2012-06-06T15:40:01.647 に答える