LLDB отображение NSDate несовместимо?

Меня озадачивают различия, подчеркнутые ниже красным:

введите описание изображения здесь

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

Это с Xcode 4.6.1


person verec    schedule 23.03.2013    source источник


Ответы (2)


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

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

person Becca Royal-Gordon    schedule 23.03.2013
comment
да. Летнее время начинается в конце марта, поэтому 20130402 сразу после ... Я просто озадачен тем, что Xcode не может согласовать часовой пояс / календарь для использования в зависимости от того, на какую панель вы смотрите ... - person verec; 23.03.2013
comment
Консоль отладки просто слепо вызывает -description, потому что это то, что вы делаете, когда хотите преобразовать объект в строку для печати. Панель переменных умнее: она смотрела на объект и определила, что это дата, поэтому хочет отобразить ее наиболее удобным способом, который только может придумать. В этих двух местах массивы и словари отображаются еще более по-разному. - person Becca Royal-Gordon; 23.03.2013

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

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

person Jason Molenda    schedule 23.03.2013
comment
Это очень интересно. Спасибо, что упомянули об этом. - person Becca Royal-Gordon; 24.03.2013
comment
Кстати, одна действительно неважная деталь реализации заключается в том, что lldb фактически вызывает _NSPrintForDebugger, который принимает указатель на объект в качестве аргумента для команды po. GDB сделал то же самое. Также есть _CFPrintForDebugger функция. - person Jason Molenda; 27.03.2013