0

ボタンが押されたときにロードしているView Controllerの保持カウントが過剰になるという奇妙なケースが発生しています。

これはコードです:

-(IBAction)new
{
    if (!viewSpace)
        viewSpace = [[ViewSpace alloc] initWithNibName:@"ViewSpace" bundle:nil];

    viewSpace.delegate = self;

    viewSpace.view.frame = CGRectMake(0, 0, viewSpace.view.frame.size.width, viewSpace.view.frame.size.height);

    [self presentModalViewController:viewSpace animated:YES];

    NSLog(@"Count Retain: %d",[viewSpace retainCount]);

}
-(void)viewSpaceWasDissmissed:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
    [viewSpace release];    
    NSLog(@"Count Retain: %d",[viewSpace retainCount]);
}

IBAction New の初回実行時、作成直後の保持カウントは 5 です。(1 でなければなりません)。

ViewSpace オブジェクトをアンロードする必要がある場合、モーダル ビューを削除して前のオブジェクトを解放するために、viewSpaceWasDismissed 関数を呼び出します。

問題は、保持カウントが 0 に達せず、ViewSpace の dealloc メソッドが呼び出されず、メモリ リークが発生することです。

私の質問は、最近作成された ViewController に 5 つの保持がある可能性はありますか? 以前に作成されたことがないことを確認しました。

ありがとう。

4

4 に答える 4

4

Cocoaは、それ自体の理由で、おそらく内部でViewControllerを4回保持しています。これは問題ではありません。

より一般的には、-retainCountメソッドはこのような理由で役に立たないため、絶対に呼び出さないでください。それはあなたを助けません、そしてそれはあなたを混乱させるでしょう。

リークをデバッグするには、リークインスツルメントを使用してオブジェクトを検査し、各保持と解放がどこから来ているかを分析して、いずれかが正しくないかどうかを判断することをお勧めします。

于 2012-01-25T17:51:06.190 に答える
3

あなたはここで2つのことを間違っています:

  1. 現在のビュー コントローラーは、モーダルに表示されたビュー コントローラーを保持し、閉じられるとそれを解放します。したがって、提示後に解放する必要があり、メソッドviewSpaceに解放メッセージは必要ありません。dismissModalViewController余談ViewSpaceですが、View Controller の名前としては不適切です。ビュー コントローラーであることがわかる前に、ビュー コントローラーとして表示されている行を読み取る必要がありました。ViewSpaceControllerより分かりやすい名前だと思います。
  2. あなたが使っretainCountているのは常に悪い考えです。重要なのは、newメソッドで所有オブジェクトを作成し ( を使用alloc)、その所有権とリリースのバランスをとったことだけです (または、少なくともポイント 1 で提案した修正を入れるときに行うことになります)。オブジェクトの所有権を取得し、それを解放しました。このretainCount方法は、あなたにとって何の役にも立たないことをまったく教えてくれません。やらないでください。所有権とリリースのバランスを取るだけで、それがすべてです。
于 2012-01-25T18:04:55.143 に答える
3

のドキュメントを確認してください-retainCount。自分で呼び出すべきではないと言っていると思います-原因となった保持を処理するだけでよく、「実際の」保持カウントについて心配する必要はありません。

于 2012-01-25T17:51:44.120 に答える
-3

私はすべてのカウントを100%確信しているわけではありませんが、ここにいくつかあります:

  • インスタンス化-1
  • NIB-1+
  • 強力なプロパティ(1+)

さらに、それを強力なプロパティとしてリストするプロパティ(ARC内)。ペン先を起動し、ペン先のデザインでコントローラーのコンポーネントを使用すると、コントローラーインスタンスの参照数が(強力に)増加することに気付きました。

于 2012-01-25T17:54:58.213 に答える