2009-03-13 17 views
0

オブジェクトがメモリから解放されたかどうかを確認するには?iphoneメモリ管理の問題

私は、オブジェクトを作成するためにalloc | copy | retainを使用すると、オブジェクトを手動でリリースする必要があることを知っています。インスタンスクラスメソッド(NSString stringwithformat:)を使用する場合、オブジェクトはNSAutoRealeasePoolによって自動的に解放されますが、時には(void)dealloc関数で解放するためにオブジェクトが使用されることがあります。

誰が私に

  1. を伝えることができ、オブジェクトを解放するのalloc機能の後に即座に[object release](void)dealloc[object release]、とNSAutoReleasePoolの違いは何ですか?

  2. いつ(void)dealloc関数が呼び出され、NSAutoReleasePoolはいつメモリを解放するのですか?すべてのループサイクルがわかります。どのようにコードからチェックできますか?

  3. 私はヘッダ内の変数を宣言し、retainとしてプロパティを設定すると、そのオブジェクトにはalloc関数を使用できますが、メモリリークは発生しませんが、this postからヘッダにretainオブジェクトが宣言されたようです両方ともオブジェクトを保持するため、オブジェクトを割り当てることができなくなります。なぜ誰かがメモリリークを引き起こすことなくこのようにコード化できる理由を教えてください。

+0

retag: "memory"& "management" to "memory-management" – Jeremiah

+0

これは本当にこの形式ではうまく答えられない質問です。Objective-Cプログラミングに関する良い本を手に入れて勉強する必要があります。 (または単にメモリ管理を放棄してARCを貼ってください) –

答えて

4
  1. [object release]すぐにオブジェクトを解放します。リリースメッセージを送信した後、オブジェクトを再度使用するべきではありません。あなたが最後の保持者だった場合は、解放の呼び出し中にメモリーを解放することができます。 Autoreleaseは、後でオブジェクトを解放します。システムは、現在のメッセージのスコープの後になること以外は、 'later'の意味について何も保証しません。

  2. 上記を参照してください。deallocがコードの観点から自動解放に続いて呼び出されるときの保証は本当にありません。 autoreleaseメッセージを送信するメソッドが戻った後であると仮定してください。

  3. あなたは単に保持と解放のバランスを取る必要があります。あなたが1対多を持っているなら(あなたが描いている状況はそうであるように)、それは漏れです。逆に不均衡がある場合、解放されたメモリにアクセスすると、より破壊的なエラーが生成されます。

保持性のために正しい順序である:

  1. alloc init // retain == 1

  2. set the property // retain == 2 due to setProperty calling retain.

  3. release the object // retain == 1

保持カウントは1になり、メモリリークは発生しません。

+0

#1を修正して、 "オブジェクトをもう一度使用しないでください"の後にピリオドを挿入します。オブジェクトを解放した後は、オブジェクトを使用しないでください。別の保持権があることを「知っている」かもしれませんが、リリースコールを別の場所に簡単に移動できる場合は、コードが混乱します。 – Alex

+0

一般にそれは当てはまりますが、私は多くの場合、弱い参照を維持することが容認できると思います。この能力がなければ、お互いを保持している2つのオブジェクトとリークで結ばれます。 経験則として、あなたは正しいです。 –

+0

...または2つの保持物を保持していて1つを解放しても、もう一方の保持物がまだあることがわかっている場合。 –