14

ブレークポイントを設定しました...

私が行った場合:

(lldb) print [self dictionary]
(NSDictionary *) $5 = 0x0945c760 1 key/value pair

しかし、私がそうする場合:

(lldb) print [[self dictionary] allKeys]
error: no known method '-allKeys'; cast the message send to the method's return type
error: 1 errors parsing expression

そこにあることがわかっているキーにアクセスしようとしても。

(lldb) print [[self dictionary] objectForKey:@"foobar"]
error: no known method '-objectForKey:'; cast the message send to the method's return     type
error: 1 errors parsing expression

私は何が間違っているのですか?

4

5 に答える 5

19
error: no known method '-objectForKey:'; cast the message send to the method's return type

つまり、送信されたメッセージの名前だけからリターンタイプ情報を推測することはできないということです。これはまったく問題ありません。そして、それはあなたがその問題をどれだけ正確に解決しなければならないかをあなたにさえ教えてくれます-あなたはメッセージsendをメソッドのreturntypeにキャストしなければなりません。

Appleのドキュメントを起動すると、一般的なObjective-Cオブジェクトタイプが- [NSDictionary objectForKey:]返されることがわかります。ididにキャストする(または、辞書に保持されているオブジェクトのタイプがわかっている場合は、その正確なオブジェクトタイプにキャストする)と、次のようになります。

(lldb) print (MyObject *)[(NSDictionary *)[self dictionary] objectForKey:@"foobar"]
于 2012-08-16T19:57:07.797 に答える
15

lldbコマンドprintは、出力する値が非オブジェクトであることを想定しています。オブジェクトを印刷するために使用する必要があるコマンドはpoです。

lldbに値を出力するように指示すると、非オブジェクトを返し失敗するallKeysというメソッドが検索されます。代わりに次のコマンドを試してください...

po [[self dictionary] allKeys]
于 2012-08-16T19:57:01.007 に答える
3

descriptionオブジェクトのをGDBまたはLLDBで印刷するには、print-objectまたはを使用する必要がありますpo

(lldb) po [self dictionary]
(lldb) po [[self dictionary] objectForKey:@"foobar"]
于 2012-08-16T20:00:05.117 に答える
2

どうして

NSLog(@"dict: %@", dictionary);

また

NSLog(@"dict objectForKey:foobar = %@", [dictionary objectForKey:@"foobar"]);
于 2012-08-16T19:56:00.933 に答える
0

現在、lldbにバグがありpo dictionary[@"key"]、キーの値ではなく空の行が出力されているようです。[dictionary[@"key"] description]代わりに値を取得するために使用します。

于 2016-06-20T19:08:33.373 に答える