Xcode Debugger: wyświetl wartość zmiennej


107

Mój kod w UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Jak mogę zobaczyć wartości debugera delegate.myDatalub indexPath.roww debugerze? delegate.myDatapowinna być tablicą i indexPath.rowrozszerzeniem int. Widzę tylko adresy pamięć o obiektach delegatei indexPathale gdzie są myDatai row?

tekst alternatywny

Odpowiedzi:


142

Sprawdź to Jak wyświetlić zawartość zmiennej NSDictionary w debugerze Xcode?

Ja też używam

po variableName
print variableName

w konsoli.

W Twoim przypadku możliwe jest wykonanie

print [myData objectAtIndex:indexPath.row]  

lub

po [myData objectAtIndex:indexPath.row]

Dziękuję Ci! Dużo próbuję: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Ale za każdym razem otrzymał komunikat „Brak członka o nazwie wiersz”. To działa: „print indexPath” i „po indexPath”. Więc próbowałem użyć "[]" zamiast ".": "Po [wiersz indexPath]" -> "Nie można wydrukować opisu obiektu NIL." "po [indexPath getRow]" -> "Obiekt docelowy nie odpowiada na ten selektor wiadomości." :-(
Manni

4
spróbuj print (int) [indexPath row]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran Jestem prawie pewien, że odpowiednikiem po objw swift jest po print(obj).
Chris

Było to idealne również do znajdowania obliczonych wartości właściwości. Dzięki!
Paula Hasstenteufel

25

Zgadzam się z innymi plakatami, że Xcode jako środowisko programistyczne powinno zawierać łatwy sposób debugowania zmiennych. Cóż, dobra wiadomość, JEST jedna!

Po przeszukaniu i nie znalezieniu prostej odpowiedzi / samouczka na temat debugowania zmiennych w Xcode, poszedłem zbadać sam Xcode i znalazłem to (przynajmniej dla mnie) bardzo przydatne odkrycie.

Jak łatwo debugować zmienne w Xcode 4.6.3

Na głównym ekranie Xcode upewnij się, że widzisz dolny obszar debugowania, klikając przycisk w prawym górnym rogu pokazany na zrzucie ekranu.

Przycisk debugowania obszaru

Obszar debugowania w Xcode 4.6.3

Teraz ustaw punkt przerwania - wiersz w kodzie, w którym chcesz zatrzymać program, klikając granicę obszaru kodu.

Punkt przerwania

Teraz w obszarze debugowania poszukaj tego przycisku i kliknij środkowy. Zauważysz, że twój obszar jest teraz podzielony na dwie części.

Podziel obszar debugowania

Powinien tak wyglądać

Teraz uruchom aplikację.

Kiedy podczas wykonywania programu zostanie osiągnięty pierwszy punkt przerwania, zobaczysz po lewej stronie wszystkie zmienne dostępne w tym punkcie przerwania.

Pole wyszukiwania

Możesz rozwinąć lewe strzałki na zmiennej, aby uzyskać więcej szczegółów. A nawet użyj pola wyszukiwania, aby wyodrębnić żądaną zmienną i zobaczyć, jak zmienia się w czasie rzeczywistym, gdy „wkraczasz” w zakres punktu przerwania.

Wkroczyć

Po prawej stronie obszaru debugowania możesz wysłać do drukowania zmienne, jak chcesz, używając prawego przycisku myszy na żądanej zmiennej.

Menu kontekstowe

Jak widać, to menu kontekstowe jest pełne bardzo interesujących opcji debugowania. Takich jak Watch , który został już zasugerowany za pomocą wpisanych poleceń lub nawet Edytuj wartość… która zmienia wartość czasu wykonania twojej zmiennej!


21

Możesz także:

  1. Ustaw punkt przerwania, aby wstrzymać wykonywanie.
  2. Obiekt musi znajdować się w zakresie wykonania
  3. Umieść wskaźnik myszy na obiekcie lub zmiennej
  4. Pojawi się żółta podpowiedź
  5. Najedź myszą na podpowiedź
  6. Kliknij dwie małe strzałki skierowane w górę iw dół
  7. Pojawi się menu kontekstowe
  8. Wybierz „Drukuj opis”, zostanie wykonany [opis obiektu]
  9. Opis pojawi się w danych wyjściowych konsoli

IMHO trochę ukryty i uciążliwy ...


W moim xcode „Drukuj opis” nie działa, więc jak mogę go włączyć?
Kirtikumar A.

@kirtiavaiya aplikacja musi być wstrzymana, a zmienna musi znajdować się w bieżącym zakresie, aby mogła zostać wydrukowana. Nie możesz również bezpośrednio drukować "self.variable", ale możesz użyć rozwiązania Andriy do drukowania _ <nazwa zmiennej>. Na przykład: dla self.btnHello napisz w konsoli „po _btnHello” (działa to tylko wtedy, gdy nie zmieniłeś nazwy metody pobierającej)
LightMan

@LightMan tak, jest tak, jak powiedziałeś, ale także nie działa
Kirtikumar A.

10

Twoje zamieszanie wynika z faktu, że zadeklarowane właściwości nie są (koniecznie nazywane tak samo jak) zmiennymi (instancji).

Wyrażenie

indexPath.row

jest równa

[indexPath row]

i cesja

delegate.myData = [myData objectAtIndex:indexPath.row];

jest równa

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

przyjmując standardowe nazewnictwo dla zsyntetyzowanych właściwości.

Co więcej, delegatejest prawdopodobnie zadeklarowany jako należący do typu id<SomeProtocol>, tj. Kompilator nie był w stanie podać rzeczywistych informacji o typie delegatew tym momencie, a debugger polega na informacjach dostarczonych w czasie kompilacji. Ponieważ idjest to typ ogólny, nie ma informacji w czasie kompilacji o zmiennych instancji w delegate.

To są powody, dla których nie widzisz myDataani rowjako zmiennych.

Jeśli chcesz sprawdzić wynik wysyłania -rowlub -myData, możesz użyć poleceń plub po:

p (NSInteger)[indexPath row]
po [delegate myData]

lub skorzystaj z okna wyrażeń (na przykład, jeśli wiesz, że Twoje delegatejest rzeczywistego typu MyClass *, możesz dodać wyrażenie (MyClass *)delegatelub kliknąć prawym przyciskiem myszy delegate, wybrać View Value as…i wpisać rzeczywisty typ delegate(np MyClass *.).

Biorąc to pod uwagę, zgadzam się, że debugger może być bardziej pomocny:

  • Może istnieć opcja nakazująca oknu debugera użycie informacji o typie czasu wykonywania zamiast informacji o czasie kompilacji. Oczywiście spowolniłoby to debugger, ale dostarczyłoby użytecznych informacji;

  • Zadeklarowane właściwości mogą być wyświetlane w grupie o nazwie właściwości i pozwalać na (opcjonalną) inspekcję bezpośrednio w oknie debugera. Spowolniłoby to również debugger z powodu konieczności wysłania wiadomości / wykonania metody w celu uzyskania informacji, ale także dostarczyłoby użytecznych informacji.


Dziękuję za wyjaśnienie! To mi bardzo pomogło! :-)
Manni

7

Możesz wydrukować wartości w oknie konsoli w czasie wykonywania. Poniżej znajdują się kroki:

  1. Umieść punkt przerwania, dla którego chcesz uzyskać wartości
  2. Teraz wykonaj debugowanie krok po kroku.
  3. Umieść kursor na zmiennej / delegacie, którego wartość ma zostać sprawdzona w czasie wykonywania.
  4. Teraz pokaże się opis zmiennej / delegata
  5. Kliknięcie „i” spowoduje wyświetlenie szczegółowego opisu
  6. Spowoduje to również wydrukowanie szczegółów w oknie konsoli.

Zrzut ekranu do drukowania szczegółów w oknie konsoli


1
Czy to działa na swift, jestem nowy w swift, nie widzę wartości obiektu, takich jak w obj c.
umairhhhs

1
@umairhhhs Ten post dotyczy tylko celu C.
Jayprakash Dubey

1
Zastanawiam się, dlaczego nie jest to w szybkim edytorze, ponieważ była to bardzo pomocna i oszczędzająca czas funkcja.
umairhhhs

1

To trochę się komplikuje. Te obiekty są niestandardowymi klasami lub strukturami, a przeglądanie ich wnętrza w Xcode nie jest tak łatwe, jak w innych środowiskach programistycznych.

Na twoim miejscu NSLogowałbym wartości, które chcesz zobaczyć, z pewnym opisem.

to znaczy:

NSLog(@"Description of object & time: %i", indexPath.row);

11
Tak, NSLog to możliwość, ale nie wygodna alternatywa dla debugowania. Jestem bardzo zaskoczony, że nie ma sposobu, aby wyświetlić żądane wartości. To należy do podstawowej funkcjonalności środowiska programistycznego.
Manni,

2
Najbardziej irytująca rzecz w XCode. Żałosne.
ryan0

1

Wypróbuj Run-> Show-> Expressions

Wpisz nazwę tablicy lub cokolwiek, czego szukasz.


Dziękuję Ci! Wpisałem „indexPath.row” i „delegate.myData” w oknie wyrażenia, ale za każdym razem pojawia się „poza zakresem” w kolumnie „Podsumowanie” :-(
Manni

np, miałem ten sam problem dopóki go nie znalazłem;)
tbone

1
ustaw punkt przerwania zaraz po ustawieniu tablicy lub cokolwiek innego i powinieneś znaleźć wartość w Wyrażeniach. Powodzenia
tbone
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.