2

私は、最新の Cocoa プロジェクトのメモリ管理に GC を使用することにしました。そして、興味深いことを発見しました。Xcode でまったく新しい Cocoa アプリ プロジェクトを作成する場合、GC をサポート対象または必須に変更し (両方を試しました)、ビルドして実行します。リークすると、メモリ リークが表示されます。

ほとんどの場合、NSCFData、GeneralBlock、CGEvent、CFDictionary、CGSRegion などのタイプのオブジェクトの多数の小さなリーク。

再現する手順:

  1. ファイル -> 新しいプロジェクト -> Cocoa アプリ
  2. プロジェクト -> プロジェクト設定の編集 -> GC 必須 (またはサポートされている、いずれか)
  3. ビルド -> ビルド
  4. 実行 -> パフォーマンス ツールで実行 -> リーク
  5. リーク検出がトリガーされるのを待ちます (私は 10 秒に設定しています。デフォルトは 30 秒です)。

約 80% の確率で、上記の種類のさまざまなオブジェクトの約 2 ~ 20 KB のリークが発生します。

他の誰かがこれと同じ行動をしていますか?


編集: InputManagers フォルダーの名前を変更して以下の状況をテストしました (その時点でログ メッセージは消えたため、ログ メッセージは確実に読み込まれなくなりました)、まだメモリ リークが発生しています。したがって、それと関係がある可能性は低いと思われます。私はそこにテキストを残しているので、アシュリー・クラークの答えはまだ理にかなっています.

私が知っている唯一の奇妙な状況は、GC を有効にしてアプリを実行するたびに、コンソールに次のメッセージが表示されることです。

2008-12-12 13:03:09.829 MemLeakTest[41819:813] Error loading /Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor:  dlopen(/Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor, 265): no suitable image found.  Did find:
    /Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor: GC capability mismatch
2008-12-12 13:03:09.840 MemLeakTest[41819:813] Error loading /Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader:  dlopen(/Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader, 265): no suitable image found.  Did find:
    /Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader: GC capability mismatch

これは、Safari (プラグイン用) だけでなく、起動するすべてのプログラムにロードしようとする 2 つのプラグインと関係があると思います。それがこれと関係があるかどうかはわかりませんが、間違いなく可能性があるようです。OS X 10.5 の代わりに開発ツールを使用して、SAFT や Inquisitor を使用せずに未使用のインストールで同じことが起こるかどうかをテストするためのクリーンな環境に簡単にアクセスできません。

4

2 に答える 2

5

このleaksツールは、Leopard の Objective-C ガベージ コレクションでは正確ではありません。これは、ガベージ コレクタの実行時構造について十分に認識していないため、まだ存在しているが再利用の準備ができているオブジェクトを実際に判断できないためです。

また、次の結果の解釈も少し間違っています。NSCFData、CGEvent などからleaksリークが発生していないように見えるもの、リークされたオブジェクトであると想定されています。

GDBのinfo gc-referencesandinfo gc-rootsコマンドは、特定のオブジェクトが Objective-C ガベージ コレクションの下で長すぎると思われる場合に使用するものです。Bill Bumgarner は、Cocoa-Dev へのこの投稿で、GC での「リーク」の一般的な概念とともにそれらについて説明しています。

于 2008-12-13T08:21:08.073 に答える
1

これらのログメッセージは、Inquisitor.bundleとSaftLoader.bundleがGCプログラムで実行するように構築されていないため、ロードされていないことを示しています。また、Safari専用の場合もありますが、これらは入力マネージャーです。つまり、すべてのCocoaアプリケーションが起動時にそれらを読み込もうとするため、不適切に記述された入力マネージャーは多くの問題を引き起こす可能性があります。

彼らがあなたが見ているものに責任があるとは思えませんが、彼らなしでテストしたい場合は、テストを実行する前にInputManagersフォルダーの名前を変更するだけで、無視されます。

しかし、これらのリークはどこで見られますか?

于 2008-12-12T21:33:56.493 に答える