2012-02-26 22 views
0

私は自分のアプリケーションを最適化し、メモリ管理が適切に実装されていることを確認中です。 didUnload/dealloc/willAppearがメモリクリーンアップの実装に信頼性がないことがわかったので、私はこのメモリ管理を完全に制御できるように私自身のメソッドを実装することにしました。メモリを明示的にリリースしてもメモリが解放されない

ヘッダーファイルで私の配列の定義

ここ
@property (retain) NSMutableArray *selectedCardIDs; 
@property (retain) NSMutableArray *selectedRowArray; 
@property (retain) NSMutableArray *cardArray; 
@property (retain) NSMutableArray *cardIDArray; 

解除方法:アレイが非常に大きい(> 1'000エントリそれぞれ)を得ることができる

- (void) willReleaseObjects { 
[self.aCopyOfCardIDArray release]; 
[self.listOfItems release]; 
[self.aCopyListOfItems release]; 
[self.selectedCardIDs release]; 
[self.selectedRowArray release]; 
[self.cardArray release]; 
[self.cardIDArray release]; 

}

なぜ、ビューがアンロードされた後に、それらの配列のリリースが不可欠であるのか。私は明示的に、IBActionメソッドでこの関数を呼び出す:私は楽器のメモリ割り当てを診断する際

- (IBAction) stopDictionary:(UIBarButtonItem *) sender { 
[self closeDatabase]; 
[self willReleaseObjects]; 
[self dismissModalViewControllerAnimated:YES]; 

}

私は、コードをデバッグし、それが実際に各リリースを実行している、しかし、それはように見えます部分的なメモリだけを解放します。実際には、このビューを再度ロードするたびにメモリ消費量が増加する理由はほとんどありません。 私の記憶がここで公開されない理由は何ですか?ありがとう。

答えて

1

割り当てまたはコピーとして宣言されたプロパティがある場合には、非常に悪いことが起こる可能性があるため、プロパティでリリースを呼び出さないでください。すでに自動リリースされている返されたインスタンスをリリースする可能性があります。

代わりに、インスタンス変数の後ろにリリースするか、プロパティをnilに設定してください。いずれにしても、正しい結果が得られます。あなたが最良の方法は、自動的に任意のオブザーバーに値を伝播しますnilにプロパティを設定することであるあなたの特性上の任意のキー/値のオブザーバー持つ場合:

- (void) willReleaseObjects { 
    self.aCopyOfCardIDArray = nil; 
    self.listOfItems = nil; 
    ... 
} 
+0

おかげでクラウスを、私は、同じ結果を試みました。私は私の質問にプロパティ定義を追加しました。あなたが見るとおり、私はそれらのすべてを保持しています。私の知る限り、割り当てられたすべてのオブジェクトは、リリースを使用してリリースする必要があります。少なくともこれは、私が今までにメモリ管理について読んだことです。私は何とか前のビューに戻ると、そのviewController全体の内容が破棄されないという印象を持っています。 – renesteg

+0

これらのプロパティにアクセスする他の場所を調べ、余分な所持がないことを確認する必要があります。また、プロパティを作成するときに漏れないようにしてください。例えば。これはリークを引き起こします:self.property = [[AClass alloc] init];とにかく、私が記述した方法は漏れを引き起こさないでしょう。 –

+0

解決済み。 allocのautoreleaseを忘れてしまった。オブジェクトは今すぐリリースされる予定です。しかし、私は別の奇妙な動作を実現しました。メインビューを開始すると、約400個のオブジェクトが割り当てられています。ビューが表示されるとすぐに、Instrumentsの割り当てカウンタは突然6,000以上に増加します。ここに修正するものがなければ、再びファントムを追い始めることはしないでください。 考えますか?そして、おそらくそのようなことに利用できるベンチマークはありますか?ビュー自体がもちろんオブジェクトそのものを作成するので、それを理解することは非常に役に立ちます。ありがとう。 – renesteg

関連する問題