2011-08-28 11 views
6

このクラスのユーザーは、クラス依存グラフを生成するための非常にきれいなツールを思いつきましたが、ソースコードの解析と#importディレクティブの検索に依存しています。Objective-Cメタデータを使用したクラス依存グラフの生成

これはきちんとしているが、私はこれで多くの問題を持っています。インポートのインポートやプレフィックスヘッダー、インポートによって参照されるファイル内のクラスが実際に使用されているかどうかは考慮されていません。

私はclass-dumpとよく似たことを行い、Mach-Oファイルに格納されたObjective-Cメタデータを調べて、クラス依存関係のメモリ内表現を生成したいと考えています。

私はむしろ、最初からこれをしないと思いますので、私は思ったんだけど:

  • は、それがすでに行われていますか?
  • 私はこの情報を抽出するために必要な基礎ツールを提供するオープンソースライブラリがありますか?(Mach-Oファイルを調べ、Objective-C情報のファサードを作成するライブラリです。すべてのクラス、メソッド、プロパティ、ivarsなどを繰り返し、他のクラスへの参照をスキャンすることができます)私はクラスダンプのソースを開始するのが良い場所になると思います。
  • あなたがこのようなことを経験していれば、実現可能なことを達成しようとしているのでしょうか?
  • 克服するためにはどんな障害が必要ですか?

答えて

3

すでに完了していますか?

これはわかりません。

私はこの情報を抽出する必要が 基本的なツールを私に提供するオープンソースのライブラリはありますか? class-dumpの中核に

は、すなわちすべてのクラス/メソッド/アイバーズなどを解析し、あなたが望むものをexatlyいたlibMachObjCです。 APIは非常にきれいです、非常に使いやすいはずです。

このようなことを経験していれば、実現しようとしているのは ですか?

残念ながら、一部のクラスでは実際のクラスが宣言されていませんが、代わりにidが使用されています。例えば、ここでのUIKitのクラスダンプから抽出できる情報は次のとおりです。

@interface UITableView : UIScrollView <NSCoding> 
{ 
    int _style; 
    id <UITableViewDataSource> _dataSource; 
    id _rowData; 
    ... 

_rowData IVAR種別情報がidですが、実行時にチェックする場合は、_rowDataUITableViewRowDataのインスタンスであることがわかりますクラス。この情報はMach-Oバイナリには存在しないので、UITableViewUITableViewRowDataの関係を見つける方法がありません。メソッドのパラメータにも同じことが適用されます。ここで

+0

お返事ありがとうございます!私は 'id'の問題を理解しています。ただし、2つの可能性のうちの1つが存在します:** A)** '_rowData'に使用される実際のクラスは、実際にあなたのサンプルクラスの依存関係ではありません。 *または* ** B)** '_rowData'に使用されている実際のクラスは、サンプルクラスのメソッドの1つによって参照されます。この場合、すべてのメソッドの内容をスキャンすると、その依存関係を見つけることができます。 – Steve

1

すでに完了していますか?

はい - しかし、私は公共の実装をお勧めすることはできません

は、私は、この情報(調べライブラリを抽出するために必要な基本的なツールを私に提供するオープンソースのライブラリがありますMach-Oファイルを作成し、そこに含まれるObjective-C情報のファサードを作成します。クラス、メソッド、プロパティ、ivarsなどのすべてを繰り返し処理し、他のクラスへの参照をスキャンすることができます)ソースは始めるのに適しています。

多くのユースケースでは、バイナリを調べるのではなく、objcランタイムファシリティobjc/...を使用すると便利です。

このようなことを経験したことがあれば、実現可能なことを達成しようとしていますか?

はい。私はobjcランタイムを使って同様のことをしました。

克服するためにはどんな障害が必要ですか?

あなたが望む詳細レベルに大きく依存します...そのような実装が見つからない場合は実装時間ですが、objcランタイムでより難解な関数をGoogleに渡す場合は、いくつかのオプションがあります。おそらく、あなたは(オープンな)言語バインディングまたはブリッジで1つを見つけるでしょうか?

あなた自身で書いてしまうと、objc_getClassListを使って登録されたobjcクラスを取得してからそこから必要なプロパティ/情報にアクセスできます。

+0

ジャスティン、フィードバックに感謝!私はどのようなクラスがメソッドの中から使われているかを見せてくれる客観的なランタイムメソッドを知らない。私は、クラスで利用できるメソッドをリストし、クラスを1つ取得することができますが、クラスFooがいくつかのメソッドの内部で使用されたことをどのように知っていますか? – Steve

+0

@スティーブ右。詳細なオブジェクトレイアウトを取得したり、パブリックとプライベートのインターフェイス、プロトコルリストなどを抽出することができます(ただし、objcのオブジェクト引数はabiのidに崩壊します)。しかし、このアプローチでは実装の内容が分かりません。 Instruments、grpof、およびgcovを使用すると、それを手助けすることができます。 objcは非常に動的な言語なので、そのような型の実行を評価することが理想的です。あなたがそのレベルの詳細を必要とするなら、クラスダンプは良い出発点かもしれません。私はもともと、あなたはその詳細を望んでいた印象のもとにいませんでした。 – justin

関連する問題