7

Objective-c で未知のオブジェクトのすべてのインスタンス変数のリストを (デバッグ経由で) 取得する方法はありますか?

私はデバッグに lldb を使用していますが、よくわかりません。

明らかに、この未知のオブジェクトのヘッダーを見ることはできません。

デバッグ時にそれを行う必要がありますが、それが不可能な場合は、実行時に別の方法を使用できます。

この投稿を見つけました: Objective-C でオブジェクトのすべてのフィールドを一覧表示するにはどうすればよいですか? しかし、私が理解しているように、既知のクラスが必要です (オブジェクトのヘッダーが必要です)

なにか提案を?

4

2 に答える 2

14

リンクした質問の受け入れられた回答のコードを利用して、デバッグ中にいつでも呼び出すことができるように、それを便利なメソッドにラップするだけです。あなたの場所では、NSObjectを拡張するカテゴリを作成し、すべての ivar を含むNSDictionaryを返すメソッドを追加します。次に例を示します。

- (NSDictionary*) ivars
{
    NSMutableDictionary* ivarsDict=[NSMutableDictionary new];
    unsigned int count;
    Ivar* ivars=class_copyIvarList([self class], &count);
    for(int i=0; i<count; i++)
    {
        Ivar ivar= ivars[i];
        const char* name = ivar_getName(ivar);
        const char* typeEncoding = ivar_getTypeEncoding(ivar);
        [ivarsDict setObject: [NSString stringWithFormat: @"%s",typeEncoding] forKey: [NSString stringWithFormat: @"%s",name]];
    }
    free(ivars);
    return ivarsDict;
}

次に、タイプがわからないオブジェクトがNSObjectから直接的または間接的に継承されている場合、このメソッドから返された辞書を出力するだけで 済みます。

(lldb) po [someObject ivars]

クレジット: Objective-C でオブジェクトのすべてのフィールドを一覧表示するにはどうすればよいですか?

PS: objc/runtime.hをインポートする必要があります。

于 2013-04-30T16:51:58.060 に答える