2009-06-01 10 views
0

NSObjectの参照が明示的にリリースされているにもかかわらず、ObjectAllocにまだ表示されている理由を追跡しています。実際には、[[myObject alloc] init]の直後に[myObject release]が続き、NSObjectを基本シェルに減らしました。ObjectAllocで解放されているようには見えません。これは、最近リリースされたViewControllerがリリースされていないため、複数のView Controllerをプッシュ/ポップするNavigationControllerアプリケーションにとって大きな問題です。これらの '未リリース' NSObject参照のためです。うーん。NSObjectのリリース...まだObjectAllocに表示されています

私のコードをここに置くことができ、たくさんの「あなたは決してどこにもいませんか? Autoreleaseプール、blah blah。

Appleのサンプル 'SeismicXML'サンプルアプリケーションを見てみましょう。ObjectAlloc/Leaksで起動してください。 getEarthquakeDataで非常に基本的な:

XMLReader *streamingParser = [[XMLReader alloc] init]; 
[streamingParser parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 
[streamingParser release];   

私はそれを解放するにもかかわらず、XmlReaderからObjectAllocに転がっジャンクのTONを参照してください。私は再び 'getEarthquakeData'を呼び出すために、このアプリケーションに 'リフレッシュ'ボタンを置く場合、私たちは5つのリフレッシュ以内にアプリをクラッシュするだろう。

どのような考えですか?

+0

電話でもシミュレータでも試しましたか? これは101の出口を引き​​起こしている実際の問題は何ですか? –

答えて

2

私はあなたのアプリケーションの存続期間中にすべてのオブジェクトの割り当てを表示するObjectAlloc機器について混乱していると思います。主な用途は、時間の経過とともにメモリ使用量を追跡することです。

あなたが望むと思う楽器は、それを参照しないことでどのような記憶が漏れているかを示す漏れと呼ばれるものです。つまり、オブジェクトが再割り当てされる前にrelease-deallocが送信されないオブジェクトへのポインタです。

1

オブジェクトに保持されている自動解放プールが存在する可能性があります。オートレリースされたオブジェクトをプールから削除せずにたくさん作成すると、オートレリープールを使って外側のループに戻るまで、リークが発生します。

ここでは自動解放プールの動作を説明します。メインループには自動解放プールがあります。オートリリースされたものはすべてそこに行きます。すべてのループ反復の最後に、プール内のすべてのオブジェクトが解放されます。別のループにオブジェクトを配置すると、メインループに戻るまで解放されません。もちろん、ループのためだけに独自の自動解放プールを作成する場合を除きます。

もう1つの問題は、オブジェクトが解放されないことです。 + allocと-releaseの間で例外が発生すると、リークが発生します。これを修正する方法は、代わりに代わりに使うことです:

[[[XMLReader alloc] init] autorelease] 

最後に、ここでガベージコレクションを行うことができます。私は、あなたが期待するべき行動を教えてくれるGCシステムについて十分に知りません。

+0

合意。リリースのドキュメントを読んでください。これは容認できる動作です。シミュレーターと同様に電話で実験を試みましたか? –

+0

私は、UICatalogサンプルアプリケーションを使用してObjectAlloc(Leaks)にストレスを与えています。このアプリでは、「Web」以外のすべてのページを起動し、メモリが増え続けるのを見てから、Web View Controllerとkaboom! kaboomの部分はシミュレータで実行されているリークでは再現できませんが、メモリはいくつかの高水準点まで蓄積され、安定しているように見えます。 なぜ、UICatalogのImageViewは、アクティブな参照がまだポップされた後に配置されているのですか?オートレリースは使用されません。 – Steve

関連する問題