Відладчик Xcode: перегляд значення змінної


107

Мій код у UITableViewController:

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

Як я можу побачити значення налагоджувача delegate.myDataчи indexPath.rowв ньому? delegate.myDataмає бути масив та indexPath.rowan int. Я можу бачити тільки адреси пам'яті об'єктів delegateі , indexPathале де myDataі row?

alt текст

Відповіді:


142

Перевірте це Як переглянути вміст змінної NSDictionary у відладчику Xcode?

Я також використовую

po variableName
print variableName

в консолі.

У вашому випадку це можливо виконати

print [myData objectAtIndex:indexPath.row]  

або

po [myData objectAtIndex:indexPath.row]

Дякую! Я дуже намагаюся: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Але щоразу я отримав повідомлення "Рядок не названий учасником". Це працює: "print indexPath" та "po indexPath". Тому я спробував використати "[]" замість ".": "Po [indexPath рядок]" -> "Неможливо роздрукувати опис об'єкта NIL." "po [indexPath getRow]" -> "Ціль не відповідає на цей селектор повідомлень." :-(
Манні

4
спробуйте print (int) [рядок indexPath]
Андрій

po [myData objectAtIndex: (int) [indexPath row]]
Андрій

@VanDuTran Я майже впевнений, що еквівалент po objу швидкому po print(obj).
Кріс

Це було ідеально для пошуку значень обчислених властивостей. Дякую!
Паула Хасстентеуфель

25

Я погоджуюся з іншими плакатами, що Xcode як середовище, що розвивається, повинен містити простий спосіб налагодження змінних. Ну, хороша новина, є одна!

Після пошуку та не пошуку простої відповіді / підручника про те, як налагодити змінні в Xcode, я пішов досліджувати сам Xcode і знайшов це (принаймні для мене) дуже корисним відкриттям.

Як легко налагоджувати свої змінні в Xcode 4.6.3

На головному екрані Xcode не забудьте побачити нижню область налагодження, натиснувши кнопку правого верхнього кута, показану на знімку екрана.

Кнопка Область налагодження

Область налагодження в Xcode 4.6.3

Тепер встановіть точку перерви - рядок у вашому коді, де ви хочете, щоб ваша програма призупинилася, натиснувши межу вашої області коду.

Точка розриву

Тепер у зоні налагодження знайдіть ці кнопки та натисніть кнопку в середині. Ви помітите, що ваша область зараз розділена на дві частини.

Сплит-зона налагодження

Має виглядати так

Тепер запустіть свою програму.

Коли під час виконання вашої програми буде досягнуто першої точки перерви, ви побачите ліворуч всі ваші змінні, доступні в цій точці розриву.

Поле пошуку

Ви можете розгорнути ліву стрілку на змінну для отримання більш детальної інформації. І навіть використовуйте поле пошуку, щоб ізолювати ту змінну, яку ви хочете, і побачити, як вона змінюється в режимі реального часу, коли ви «ступаєте» в область дії точки перелому.

Крок у себе

У правій частині області налагодження ви можете надіслати друк змінних за вашим бажанням, натиснувши праву кнопку миші на потрібну змінну.

Контекстне меню

Як бачите, це контекстне меню наповнене дуже цікавими параметрами налагодження. Наприклад, Watch, що вже пропонується за допомогою набраних команд або навіть Edit Value…, що змінює значення часу виконання вашої змінної!


21

Також ви можете:

  1. Встановіть точку перерви, щоб призупинити виконання.
  2. Об'єкт повинен знаходитись у межах виконання
  3. Наведіть курсор миші на об’єкт або змінну
  4. З'явиться жовта підказка
  5. Наведіть курсор миші на підказку
  6. Клацніть по дві маленькі стрілки, спрямовані вгору та вниз
  7. З'явиться контекстне меню
  8. Виберіть "Опис друку", воно виконає [опис об'єкта]
  9. Опис з’явиться у висновку консолі

ІМХО трохи прихований і громіздкий ...


У моєму xcode "Опис друку" не працює, тож як я можу це включити?
Кіртікумар А.

@kirtiavaiya додаток має бути призупинено, і ваша змінна повинна бути в межах поточного обсягу для друку. Також ви не можете безпосередньо друкувати "self.variable", але ви можете використовувати рішення Андрія для друку _ <ім'я змінної>. Наприклад: для self.btnЗдравствуйте, пишіть у консоль "po _btnHello" (це працює лише у тому випадку, якщо ви не змінили ім'я методу getter)
LightMan

@LightMan так, це, як ви сказали, але тоді також не працює
Kirtikumar A.

10

Ваша плутанина випливає з того, що декларовані властивості не є (обов'язково названими такими ж) (екземплярами) змінними.

Вираз

indexPath.row

еквівалентно

[indexPath row]

і призначення

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

еквівалентно

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

припускаючи стандартне найменування для синтезованих властивостей.

Крім того, delegateймовірно, оголошено як тип id<SomeProtocol>, тобто компілятор не зміг надати фактичну інформацію про тип delegateна той момент, і налагоджувач покладається на інформацію, надану під час компіляції. Оскільки idце загальний тип, немає інформації про час збирання про змінні екземпляра в delegate.

Такі причини , чому ви не бачите myDataабо rowяк змінні.

Якщо ви хочете перевірити результат надсилання -rowабо -myData, ви можете використовувати команди pабо po:

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

або скористайтеся вікном виразів (наприклад, якщо ви знаєте, що ваш delegateвласне тип MyClass *, ви можете додати вираз (MyClass *)delegateабо клацнути правою кнопкою миші delegate, вибрати View Value as…та ввести фактичний тип delegate(наприклад MyClass *).

Зважаючи на це, я згоден, що налагоджувач може бути кориснішим:

  • Можливо, є можливість сказати у вікні налагодження використовувати інформацію про тип запуску замість інформації про час компіляції. Це сповільнить налагоджувач, надається, але надасть корисну інформацію;

  • Заявлені властивості можуть бути показані у групі, яка називається властивостями, і дозволяти (необов'язково) перевіряти безпосередньо у вікні налагодження. Це також уповільнить відладчик через необхідність надсилання повідомлення / виконання методу для отримання інформації, але також надасть корисну інформацію.


Дякую за ваше пояснення! Це мені дуже допомогло! :-)
Манні

7

Ви можете друкувати значення у вікно консолі під час виконання. Нижче наведено етапи:

  1. Розмістіть точку перерви, для якої ви хочете отримати значення
  2. Тепер виконуйте поетапну налагодження.
  3. Помістіть курсор на змінну / делегат, значення якої слід перевірити під час виконання.
  4. Тепер це покаже опис змінної / делегата
  5. Клацання на "i" покаже детальний опис
  6. Це також буде надрукувати деталі у вікні консолі.

Знімок екрана для друку деталей на вікні консолі


1
Чи працює це на swift, я новачок у швидкому нахилі бачу значення об’єкта, як ми звикли бачити в obj c.
umairhhhs

1
@umairhhhs Ця публікація призначена лише для Objective-C.
Джайпракаш Дюбі

1
Мені цікаво, чому це не в швидкому редакторі, тому що це дуже допомагало та економило час.
umairhhhs

1

Це стає трохи складніше. Ці об'єкти - це власні класи або структури, і дивитися всередині них на Xcode не так просто, як в інших середовищах розробки.

Якби я був ти, я б NSLog значення, які ви хочете бачити, з деяким описом.

тобто:

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

11
Так, NSLog - це можливість, але не зручна альтернатива налагодження. Я дуже здивований, що немає можливості відобразити бажані значення. Це належить до базової функціональності середовища розробки.
Манні

2
Найбільше розлютило XCode. Жалюгідний.
ryan0

1

Спробуйте запустити-> Показати-> Вирази

Введіть ім'я масиву або що ви шукаєте.


Дякую! Я вводив "indexPath.row" та "delegate.myData" у вікно виразів, але щоразу з'являється "поза межами" у стовпці "Підсумок" :-(
Manni

np, у мене було те саме питання, поки я його не знайшов;)
tbone

1
встановіть точку перерви відразу після встановлення масиву або будь-якого іншого, і ви повинні знайти значення у виразах. Удачі
tbone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.