2012-01-25 3 views
0

ボタンが押されたときに読み込んでいるビューコントローラの保持回数が異常に多いという問題が発生しました。最近作成されたオブジェクトの保持数が多い。 Objective-C

-(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新が初めて実行されるときだけで作成されたとき、保持カウントが5:

これはコードです。 (1にする必要があります)。

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

問題は、保持カウントが0になることはなく、ViewSpaceのdeallocメソッドは決してメモリリークを引き起こして呼び出されないということです。

私の質問は、最近作成されたViewControllerが5を保持することはどうですか?私はこれまでに決して作成されていないことを確認しました。

ありがとうございました。

+3

は 'retainCount'は全く役に立ちません。あなたはそれについて考えるあなたの時間を無駄にしています。 – bbum

+0

はい、問題はViewSpaceオブジェクトのdeallocに達していないことです。これは私のアプリで大きなメモリ使用量を引き起こし、クラッシュします。 – NemeSys

+1

@bbumあなたはretainCountタグのrssフィードを見ていますか? ;) – Abizern

答えて

4

ココアはおそらく、それ自身の理由から、ビューコントローラを内部的に4回保持しています。これは問題ではありません。

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

リークをデバッグするには、機器のリークを使用してオブジェクトを検査し、それぞれの保持と解放がどこから来ているのかを分析して、間違っているかどうかを判断することをお勧めします。

3

-retainCountのドキュメントを確認してください。私はそれはあなた自身がそれを呼び出すべきではないと言います - あなたは、あなたが引き起こす保持を処理し、「実際の」保持カウントについて心配する必要はありません。

-3

私はあらゆる数の100%はわからないが、ここでいくつかある:

  • インスタンス - 1
  • NIB - 1+
  • 強い特性(1+)

さらに、それを強力なプロパティ(ARC内)としてリストするプロパティ。 ペン先を起動し、ペン先のデザインでコントローラーのコンポーネントを使用すると、コントローラーインスタンスの参照カウントが(強く)増加します。あなたが間違ってここに二つのことをやっている

+0

ARCはこのコードには適用されません。 ARCでは、 'release'と' retainCount'の呼び出しは許可されていません。 – Abizern

3

  1. 現在のView Controllerはモーダル提示ビューコントローラを保持し、それが却下されたときにそれをreleaseds。したがって、viewSpaceが提示された後でそれを解放し、dismissModalViewControllerメソッドでリリースメッセージを必要としません。脇の下として、ViewSpaceは、ビューコントローラにとっては貧弱な名前です。私はそれがビューコントローラであることを知る前に、あなたがビューコントローラとしてそれを提示している行を読みなければなりませんでした。私はViewSpaceControllerがもっとわかりやすい名前だと思う。
  2. retainCountこれは常に悪い考えです。すべての重要な点は、newメソッドで所有オブジェクト(alloc)を作成し、その所有権をリリースと調整したことです(または、ポイント1で提案した修正を行ったときに少なくとも行います)。あなたはオブジェクトの所有権を取り、それを解放しました。 retainCountメソッドは、あなたに何も使用できないことは絶対に教えてくれません。それをしないでください。オーナーシップとリリースのバランスをとるだけで問題ありません。
+0

私は提案どおりに適用しました。しかし、問題はまだ残っています。 deallocメソッドは決して達成されず、私はメモリ使用の問題を抱えています。 – NemeSys

+0

'retainCount'は漏れを見つけるのに役立たないでしょう。計測器を使用してアプリを実行し、実際にあなたのView Controllerで何が起こっているかを確認します。 – Abizern

+0

私は、私は保持カウントを削除し、私は楽器を使用しています。問題は、ViewSpaceオブジェクトがロードされ、アンロードされるたびに、メモリが1,30Mb増加することです。いくつかのオープン/クローズアクションの後、アプリケーションがクラッシュします。 – NemeSys

関連する問題