我正在尝试修复iPhone应用中的错误,并发现自己面对这种情况。 实例变量myView的类型为MYTextView,而MYTextView是UITextView的子类。
在调试器中,我连续几次输入:p myView.text 如下所示,奇怪的是,我得到了不同的结果:
(lldb) p myView.text
(NSString *) $34 = 0x095da870 @"พี(the-date-in-Thai-Language)
05"
(lldb) p myView.text
(NSString *) $35 = 0x0a2c5620 @"พี(the-date-in-Thai-Language)
"
(lldb) p myView.text
(NSString *) $36 = 0x09515f60 @"พี(the-date-in-Thai-Language)
щ"
(lldb) p myView.text
(NSString *) $37 = 0x09515f80 @"พี(the-date-in-Thai-Language)
㏀ड़ख़筀ज़툠ज़梐
⨈Ⴊ"
(lldb) p myView.text
(NSString *) $38 = 0x0a2c3800 @"พี(the-date-in-Thai-Language)
妜샷फ़"
(lldb) p myView.text
(NSString *) $39 = 0x095e7010 @"พี(the-date-in-Thai-Language)
"
结果高于$ 35和$ 39包含我期望的结果,其他行包含期望字符串末尾的垃圾。
我不明白这个变化的垃圾是如何在这里的,当我应该在调试器内部暂停时。 还有一件事是我只有泰语才会遇到这种问题。
有没有人知道会发生什么事?
答案 0 :(得分:0)
这看起来像NSString的数据格式化程序中的错误。 你在Xcode 4.6上吗?如果是这样的话,如果您在尽可能多的情况下提交了针对Xcode的错误,我会很高兴。 我的猜测是有一些缓冲区无法正常管理。
答案 1 :(得分:0)
当你使用p
命令时,lldb可以做几件事。
对于简单的具体类型(int
,int *
),它只能打印变量中的值(10,0xffffffff83021600)。它可能具有格式化程序首选项集(例如,以十六进制显示int
)。它可能有一个更复杂的python格式化程序(它可以读取内存的不同部分并向您呈现对象的高级视图)。最后,它可能实际上在您的程序中运行代码,以提供该变量的高级视图。
在这种情况下,使用Xcode 4.6,这看起来像一个简单的NSString
ivar,因此期望lldb可以将其内置的python格式化程序用于NSString对象。这个内置格式化程序查看对象内存,并知道如何重构实际字符串以便显示而无需在程序中运行任何代码。在这种情况下,不应修改字符串的内容。
早期版本(和gdb)可能会在程序中运行代码来格式化字符串,并且程序可能会在此过程中稍微改变一下。有很多工作要做,以确保不会发生,但存在这种可能性。
Enrico怀疑NSString
的内置python格式化程序函数可能在您的程序中以某种方式行为不端,并提供在重新调用格式化程序时更改的字符串摘要。请在http://bugreport.apple.com/处提交错误报告,并提供有关如何重现此行为的详细信息。