Xcode NSDate的LLDB显示不一致?

Xcode NSDate的LLDB显示不一致?,xcode,nsdate,lldb,Xcode,Nsdate,Lldb,我对以下红色下划线的差异感到困惑: 为什么当被要求“打印“日期”的描述时,相同的NSDate对象在调试窗格中以BST显示,而在LLDB终端中以GMT显示 这是Xcode 4.6.1中的一个NSDate表示时间上的一个特定时刻,而不考虑人们称之为什么时刻。如果你看NSDate,你会发现甚至没有hour、minute或second属性,更不用说时区了y、 时区是NSCalendar的一项功能,用于解释显示的NSDate。(您可能更熟悉NSDateFormatter;它在内部使用NSCalendar

我对以下红色下划线的差异感到困惑:

为什么当被要求“打印“日期”的描述时,相同的NSDate对象在调试窗格中以BST显示,而在LLDB终端中以GMT显示


这是Xcode 4.6.1中的一个
NSDate
表示时间上的一个特定时刻,而不考虑人们称之为什么时刻。如果你看
NSDate
,你会发现甚至没有
hour
minute
second
属性,更不用说
时区了y、 时区是
NSCalendar
的一项功能,用于解释显示的
NSDate
。(您可能更熟悉
NSDateFormatter
;它在内部使用
NSCalendar
来解释日期。)


在本例中,Xcode恰好为变量面板配置了日历,这与LLDB为调试控制台配置日历的方式略有不同。我不得不猜测,调试控制台正在调用
-description
,它始终使用UTC,而变量面板正在使用符合当前时区的日期格式化程序。(您的Mac配置为使用BST,对吗?如果不是,这是一个奇怪的选择…)一个
NSDate
表示一个特定的时间点,而不考虑人类称之为什么时刻。如果你看
NSDate
,你会发现甚至没有
小时
分钟
属性,更不用说
时区了重新定义用于解释显示的
NSCalendar
(您可能更熟悉
NSDateFormatter
;它在内部使用
NSCalendar
来解释日期。)


在本例中,Xcode恰好为变量面板配置了日历,这与LLDB为调试控制台配置日历的方式略有不同。我不得不猜测,调试控制台正在调用
-description
,它始终使用UTC,而变量面板正在使用符合当前时区的日期格式化程序。(您的Mac配置为使用BST,对吗?如果不是,这是一个奇怪的选择…)布伦特的回答很好-但我想特别说明一个细节。lldb为许多常见类型(包括
NSDate
)内置了类型格式化程序。如果在调试器控制台中执行
p date
,您将获得与在“局部变量”窗口中看到的相同的输出。当您右键单击/control并单击变量时“打印描述”,相当于在控制台中写入
po date
——正如Brent所说,它调用
-description
方法


这不是控制台vrs.Locals窗口差异,也不是Xcode vrs.lldb差异。一种访问方法是使用lldb的内置数据格式化程序,另一种是调用
-description

Brent的回答很好-但我想特别说明一个细节。lldb为许多常见类型(包括
NSD)内置了类型格式化程序ate
。如果您在调试器控制台中执行了
p date
,您将获得与在本地窗口中看到的相同的输出。当您右键单击/control单击变量并“打印说明”时,这相当于在控制台中写入
po date
——正如Brent所说,它调用
-description
方法


这不是控制台vrs.Locals窗口的差异,也不是Xcode vrs.lldb的差异。一种访问方法是使用lldb的内置数据格式化程序,另一种是调用
-description

是的。DST在三月底启动,所以20130402就在之后……我只是对Xcode无法就使用的时区/日历达成一致感到困惑调试控制台只是盲目地调用
-description
,因为当您想将对象转换为字符串以进行打印时,就是这样做的。变量面板更智能:它查看对象并确定它是一个日期,所以它想以最有用的方式显示它两个地方显示数组和字典的方式更为不同。是的。DST在三月底开始,所以20130402就在后面…我只是感到困惑,Xcode无法根据您查看的窗格就要使用的时区/日历达成一致…调试控制台只是盲目地调用
-description
,因为这是您需要做的你想将一个对象转换成字符串进行打印。变量面板更智能:它查看对象并确定它是一个日期,因此它希望以最有用的方式显示它。这两个地方显示数组和字典的方式更为不同。这非常有趣。谢谢你提到它。顺便说一句,这是一个真正不受欢迎的地方重要的实现细节是,对于
po
命令,lldb实际上调用了
\u NSPrintForDebugger
,它以一个对象指针作为参数。gdb也做了同样的事情。还有一个
\u CFPrintForDebugger
函数。这非常有趣。感谢您提到它。顺便说一句,这是一个非常不重要的实现详细说明是,lldb实际上调用了
\u NSPrintForDebugger
,它将对象指针作为其参数,用于
po
命令。gdb也做了同样的事情。还有一个
\u CFPrintForDebugger
函数。