2013-03-23 2 views
1

Я озадачен различия подчеркиваются красным ниже:Дисплей LLDB NSDate несовместим?

enter image description here

Как же это тот же самый NSDate объект отображается в BST в панели отладки, но в GMT в терминале LLDB, когда просят» описание Печать «дата»»?

Это с Xcode 4.6.1

ответ

4

NSDate представляет определенный момент времени, без учета того, что люди называют этот момент. Если вы посмотрите на NSDate, вы ' ll замечают, что нет даже hour, minute, или second объектов недвижимости, не говоря уже о timeZone. Часовой пояс является функцией NSCalendar, используемой для интерпретации этого NSDate для отображения. (Вы можете быть более знакомы с NSDateFormatter, он внутренне использует NSCalendar интерпретировать дату.)

В этом случае Xcode происходит настроить календарь на панели переменных немного по-другому от того, как LLDB настраивает один для отладки консоль. Я должен был предположить, что консоль отладки вызывает -description, которая всегда использует UTC, а панель переменных использует формат даты, который соответствует текущему часовому поясу. (Ваш Mac настроен на использование BST, верно? Если нет, это нечетный выбор ...)

+0

Да. DST пинает в конце марта, так что 20130402 сразу после ... Я просто озадачен тем, что Xcode не может согласиться с часовым поясом/календарем для использования в зависимости от того, на какой панели вы смотрите ... – verec

+2

Консоль отладки просто слепо вызывая '-description', потому что это то, что вы делаете, когда хотите преобразовать объект в строку для печати. Панель переменных более умна: она просматривает объект и определяет дату, поэтому он хочет отобразить его наиболее полезным способом, с помощью которого он может возникнуть. Два места отображают массивы и словари еще более по-разному. –

3

Ответ Брент в порядке, но я хотел обратиться к одной детали специально. lldb имеет встроенные типы форматировщиков для многих распространенных типов, включая NSDate. Если вы сделали p date в консоли отладчика, вы получите тот же результат, что и в окне Locals. Когда вы щелкнули правой кнопкой мыши/щелкнули по клику по переменной и сделали «Описание печати», это эквивалентно написанию po date в консоли - как говорит Брент, он вызывает метод -description.

Это не консоль vrs. Разница окон локалей или Xcode vrs. lldb разница. Один метод доступа использует встроенные форматы данных lldb, а один вызывает -description.

+0

Это очень интересно. Спасибо, что упомянул об этом. –

+0

Кстати, одна очень несущественная деталь реализации заключается в том, что lldb на самом деле вызывает '_NSPrintForDebugger', который принимает указатель объекта в качестве своего аргумента для команды' po'. gdb сделал то же самое. Также есть функция '_CFPrintForDebugger'. –

Смежные вопросы