Меня озадачивают различия, подчеркнутые ниже красным:
Почему этот самый объект NSDate отображается в BST на панели отладки, но в GMT в терминале LLDB, когда его спрашивают «Распечатать описание« даты »»?
Это с Xcode 4.6.1
Меня озадачивают различия, подчеркнутые ниже красным:
Почему этот самый объект NSDate отображается в BST на панели отладки, но в GMT в терминале LLDB, когда его спрашивают «Распечатать описание« даты »»?
Это с Xcode 4.6.1
NSDate
представляет определенный момент времени, без учета того, что люди называют этим моментом. Если вы посмотрите на NSDate
, вы заметите, что нет даже свойств hour
, minute
или second
, не говоря уже о свойстве timeZone
. Часовой пояс - это функция NSCalendar
, используемая для интерпретации этого NSDate
для отображения. (Возможно, вы более знакомы с NSDateFormatter
; внутри используется NSCalendar
для интерпретации даты.)
В этом случае Xcode настраивает календарь для панели переменных немного иначе, чем LLDB настраивает календарь для консоли отладки. Я должен был предположить, что консоль отладки вызывает -description
, который всегда использует UTC, в то время как панель переменных использует средство форматирования даты, которое уважает текущий часовой пояс. (Ваш Mac настроен на использование BST, верно? Если нет, то это странный выбор ...)
-description
, потому что это то, что вы делаете, когда хотите преобразовать объект в строку для печати. Панель переменных умнее: она смотрела на объект и определила, что это дата, поэтому хочет отобразить ее наиболее удобным способом, который только может придумать. В этих двух местах массивы и словари отображаются еще более по-разному.
- person Becca Royal-Gordon; 23.03.2013
Ответ Брента хорош, но я хотел конкретно остановиться на одной детали. lldb имеет встроенные средства форматирования для многих распространенных типов, включая NSDate
. Если вы выполнили p date
в консоли отладчика, вы получите тот же результат, что и в окне локальных переменных. Когда вы щелкаете правой кнопкой мыши или нажимаете клавишу Control и выполняете «Распечатать описание», это эквивалентно написанию po date
в консоли - как говорит Брент, он вызывает метод -description
.
Это не консоль vrs. Разница между окнами локальных переменных или Xcode vrs. lldb разница. Один метод доступа использует встроенные средства форматирования данных lldb, а другой вызывает -description
.
_NSPrintForDebugger
, который принимает указатель на объект в качестве аргумента для команды po
. GDB сделал то же самое. Также есть _CFPrintForDebugger
функция.
- person Jason Molenda; 27.03.2013