3

XCode 4.5を使用して新しいCocoa(Mac OS X)アプリケーションを作成し、「ドキュメントベース」オプションをオフにし、「自動参照カウント」をオンにすると、何も変更せずにビルドし、「リーク」を使用してプロファイラーを使用して実行しますテンプレートでは、19.76メガバイトの一時的なメモリ使用量と2.23メガバイトの「ライブバイト」が表示されます。これには、3132 CFStrings、1371 CFBasicHash、およびプログラムが終了してもCoreGraphicsによって割り当てられた192 kbを含む数百の奇数mallocs()が含まれます。これらはすべて「割り当て」タイムラインに表示されますが、「リーク」タイムラインには出力されません。この格差は紛らわしいと思います。

たとえば、簡単なCocoaベースの参照アプリケーションを使用して、可能であれば知りたいのですが、そうでない場合は、どのリークが私のもので、どれが予想されるかを知るための参照手法を知りたいと思います。

Foundation-frameworkにリンクされたコマンドラインツールを使用すると、「すぐに使用できるリーク」の数がはるかに簡単になり、合計で約18のmallocs()、合計1.06 kbになるため、AppKit(Cocoa)がほとんどの原因であるようです。デフォルトの「プログラムの最後にまだヒープ上にある、リークではないライブオブジェクト」。

単純な非リークのCocoaベース参照アプリケーションを作成する方法はありますか、それともフレームワーク自体が(おそらく意図的に)リークしすぎて実際には不可能ですか?

はい、静的分析を知っています。はい、ガベージコレクションを認識しています。誰かがガベージコレクションを使用せず、ARCのみを使用し、実行時に何がリークしたかを実際に確認したい場合、その人は、基盤とフレームワークの14799程度のリークを無視することなく、そうすることができますか?

更新:私自身の混乱のソース#1は、示唆されているように、私が間違ったタイムラインを見ていることです...しかし、私自身の防御(または私の混乱を説明するため)では、私は常にまだ割り当てられているオブジェクトを検討しましたリークとしてのプログラム実行の最後のヒープで、Pascal(Delphi)とC ++の世界で、そして実際にLinuxとWindowsのほとんどのガベージコレクションされていない言語で一般的に見られるルール。たぶん、それはObjective-Cの世界ではまったく「リーク」ではないのでしょうか。メモリタイムラインの「生きているアイテム」はまだ「ヒープ上でアクティブ」ですか?それはリークとどう違うのですか?私のAppControllerが「dealloc」と言われることがないという事実は私にとっても驚きでしたが、「予想される」と言われています。

ここに画像の説明を入力してください

4

1 に答える 1

6

それらは「作成され、まだ生きている」オブジェクトのように見えます。これらはリークではなく、ライフサイクルを完了していないオブジェクトにすぎません。アプリケーションはまだ実行されているため、オブジェクトのセットは常に存在しますが、それらへのポインターはあります。

リークはまだ存在しているオブジェクトですが、それへのポインタはありません。ポインタがないと、メモリのその部分をOSに戻すことはできません。

実際のリークを確認するには、Instrumentsの上部にあるリークのタイムラインを確認してください。リークが発生すると、このタイムラインに赤いバーが表示されます。このバーの周りに検査範囲を設定して、以下のリークの詳細を表示します

ここに画像の説明を入力してください

于 2013-01-15T21:31:05.783 に答える