4

私は以前にゾンビを使用したことがなく、それが何をしているのかよくわからないことを認めなければなりません. ただし、次のことが気になります。

CFArray は、Live Bytes 列と # Living 列を継続的に増やしているようで、関連していると思われるいくつかの malloc も同様です。これは、私のアプリがそこに座ってレンダリング (OpenGL) し、入力を待っているときです。

リーク インストゥルメントを実行してみましたが、この期間中にメモリ リークが発生したり、それ以上の割り当てが発生したりすることはありません。CFArray は言うまでもなく、何も割り当てられません。

では、2 つの手段のうちどちらを信じればよいのでしょうか。それとも、単にゾンビインストゥルメントが実際に何をしているのか理解していないだけですか?

誰かが私に指摘できるゾンビに関する適切なドキュメントがあれば、それは素晴らしいことです. Apple のドキュメントは、それを少し詳しく説明しているようです。

4

2 に答える 2

6

NSZombies は基本的に、割り当て解除されたオブジェクトをプレースホルダーに置き換えて、割り当て解除後にアクセスされた場合に開発者に通知します (明らかに悪いことです)。これは、保持/解放の問題を解決するのに役立ちます。

これをオンにすると、実際に何も割り当て解除されないため、アプリはふるいのようにメモリ リークしているように見えます。通常、私はデバッグ中に特定のクラッシャーを探すために NSZombies を使用します (または、Allocations インストルメントで Zombies をオンにすることもできます - これにより、メモリ使用量が増加するだけであることも警告されるはずです)...私は Leaks または Allocations w/Heap Shots を使用します機能しているアプリでメモリ分析を行うためのインストゥルメント。

SOに関するもう1つの良い質問/回答: NSZombieとは何ですか?

于 2011-02-02T22:53:22.173 に答える
2

ゾンビを有効にすると、保持カウントが 0 に達したときに objc インスタンスが解放されないことがわかります (通常、この時点で dealloc が呼び出され、オブジェクトのメモリが解放されます)。具体的には、dealloc が呼び出されますが、オブジェクトは解放されず、ref カウントは後で使用できるようになります。

もちろん、他にも実装の詳細があります。メッセージング システムのどこかで、ゾンビにメッセージを送信していないことをシステムがチェックします (ゾンビとは、保持カウントが 0 のオブジェクトです)。ゾンビにメッセージを送信すると、システムがこれを検出します (ゾンビを有効にして実行しているときに発生する可能性があるため)。

于 2011-02-02T22:56:11.443 に答える