デバッガーでインスタンス変数のアドレスを表示する場合、指定されたメモリ アドレスを入力してクラスを取得するにはどうすればよいですか?
p someObjectInstance
デバッガーまたはコード内から反対のこと (インスタンスからアドレスを取得すること) が可能であることを知っていNSLog(@"%p", someObjectInstance);
ます。これを逆に行う同様の方法はありますか?
デバッガーでインスタンス変数のアドレスを表示する場合、指定されたメモリ アドレスを入力してクラスを取得するにはどうすればよいですか?
p someObjectInstance
デバッガーまたはコード内から反対のこと (インスタンスからアドレスを取得すること) が可能であることを知っていNSLog(@"%p", someObjectInstance);
ます。これを逆に行う同様の方法はありますか?
あなたが求めているのは非常に安全ではありません。不明なメモリの場所にアクセスすることは一般的に悪い考えですが、あなたが尋ねたので:
編集:gdb
または内の場合lldb
、次のことができます:
po [(id)(0xDEADBEEF) class]
ただし、コードから実行する場合は、次を使用します。
NSString *input = @"0xFAFAFA";
unsigned address = UINT_MAX; // or UINT_MAX
[[NSScanner scannerWithString:input] scanHexInt:&address];
if (address == UINT_MAX)
{
// couldn't parse input...
NSLog(@"failed to parse input");
return 0;
}
void *asRawPointer = (void *) (intptr_t) address;
id value = (__bridge id) asRawPointer;
// now do something with 'value'
NSLog(@"%@", [value class]);
デバッガーpo
では、有効なObjective-Cオブジェクトであると思われるアドレスで使用できます。たとえば、私のプログラムの1つを実行する0x9549ee0
と、UIFontオブジェクトを指していることがわかります。
使用するpo
と、次のようになります。
(gdb) po 0x9549ee0
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px
これにより、以下を使用して取得したのと同じ情報が出力されます。
NSLog(@"%@", someObject);
つまり、の結果です[someObject description]
。多くの場合、これにはクラス名だけではなく、より有用な情報が含まれています(上記の例からわかるように)。
リチャードJ.ロスIIIは、これを慎重に行う必要があると述べています。デバッガーは、アドレスが無効であるかどうかを判断できることがよくあります。次に例を示します。
(gdb) po 0x9449ee0
0x9449ee0 does not appear to point to a valid object.
しかし、これを行う方法は絶対確実ではありません。プログラムのコードでそれを行うと、クラッシュする可能性があります。
もちろんpo
、変数を直接使用することもできます。
(gdb) po font
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px
お役に立てれば。
デバッグ領域を右クリックし、[Debug Area Help] -> [Viewing Memory Locations] を選択します。
または、Xcode のドキュメントで次の場所に移動します。
Xcode Developer Library->Xcode->IDEs->Debug Area Help-> Viewing Memory Locations