2012-08-16 15 views
11

ustawić punkt przerwania ...Jak mogę uzyskać wartość/klucze obiektów NSDictionary w konsoli debuggera?

jeśli robię:

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

ale jeśli robię:

(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 

Nawet jeśli próbuję uzyskać dostęp do klucza, że ​​wiem, jest tam ..

(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 

Co robię źle?

+1

Pierwszą rzeczą, którą robisz źle, jest oznaczenie tego pytania jako "xcode". –

+0

'po [własny słownik]' – Joe

Odpowiedz

14

Czy mówisz po angielsku? - Wygląda na to, że całkiem nieźle! I ach, co za zbieg okoliczności, także debugger!

Bardzo dobrze, skończyliśmy z trudną częścią. Więc teraz, że rozumieją się nawzajem z debuggera, zobaczmy, co sugeruje:

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

tak, mówi, że nie można wywnioskować informacje typu zwrot jedynie z nazwy wyślij wiadomość - i to perfekcyjnie (nie używa się węgierskiej notacji, prawda?). I nawet mówi ci, jak dokładnie musisz rozwiązać ten problem - musisz rzucić wiadomość wysłać do typ zwrotu metody.

Rozpalając dokumenty Apple, dowiadujemy się, że - [NSDictionary objectForKey:] zwraca id - ogólny typ obiektu Objective-C. Casting do id (lub nawet lepiej, jeśli wiesz, jakie typy obiektów słownika ładowni, odlewy z tym dokładnym typu obiektu) załatwia sprawę:

(lldb) print (MyObject *)[(NSDictionary *)[self dictionary] objectForKey:@"foobar"] 
+1

Dziękuję, że jesteś inteligentny! :) Zostawię kolejny przykład tego problemu: ** Fail: ** 'print [[[self.collectionView gestureRecognizers] objectAtIndex: 0] isKindOfClass: [Klasa UITapGestureRecognizer]] ' ** Dobrze: **' print (BOOL) [[[self.collectionView gestureRecognizers] objectAtIndex: 0] isKindOfClass: (Class) [Klasa UITapGestureRecognizer]] ' Zwróć uwagę na 2 odlewy wymagane do działania. – Jeff

+0

Zostaw to Celowi C, aby wyciągnąć proste z głupiej prostoty. –

3

Dlaczego po prostu nie zrobić

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

lub

NSLog(@"dict objectForKey:foobar = %@", [dictionary objectForKey:@"foobar"]); 
+0

Myślę, że próbuje uzyskać informacje z konsoli, a nie z kodu źródłowego. Jednak jest to lepszy sposób, aby to zrobić w mojej opinii. –

13

lldb polecenie drukowania oczekuje, że wartość, którą chcesz wydrukować jest non-object. Polecenie, które powinno być używane do drukowania obiektów, to po.

Kiedy powiesz lldb, aby wydrukować wartość, szuka metody o nazwie allKeys, która zwraca obiekt niebędący obiektem i kończy się niepowodzeniem. Zamiast tego spróbuj następującego polecenia:

po [[self dictionary] allKeys] 
3

aby wydrukować description obiektu w GDB lub LLDB trzeba używać print-object lub po.

(lldb) po [self dictionary] 
(lldb) po [[self dictionary] objectForKey:@"foobar"] 
0

Wydaje się, że to błąd w lldb w momencie powodując po dictionary[@"key"] wydrukować pustą linię zamiast wartości w kluczu. Użyj wartości [dictionary[@"key"] description], aby uzyskać wartość.

Powiązane problemy