0

我正在尝试修复 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 包含我期望的内容,其他行在期望字符串的末尾包含垃圾。

当我应该在调试器中暂停时,我不明白这种不断变化的垃圾怎么会出现在这里。还有一件事是我只有泰语才有这种问题。

有谁知道会发生什么?

4

2 回答 2

0

这看起来像是 NSString 的数据格式化程序中的一个错误。你在 Xcode 4.6 上吗?如果是这样,我会很高兴你向 Xcode 提交了一个尽可能多的上下文错误。我的猜测是有些缓冲区没有得到妥善管理。

于 2013-05-19T15:56:45.803 回答
0

当您使用该p命令时,lldb 可以执行多种不同的操作。

对于简单的具体类型 ( int, int *),它可能只打印变量 (10, 0xffffffff83021600) 中的值。它可能有一个格式化程序首选项集(例如int以十六进制显示)。它可能有一个更复杂的 python 格式化程序(它可以读取内存的不同部分并向您呈现对象的高级视图)。最后,它实际上可能会在您的程序中运行代码以提供该变量的高级视图。

在这种情况下,使用 Xcode 4.6,这看起来像一个简单的NSStringivar,因此期望 lldb 可以将其内置的 python 格式化程序用于 NSString 对象。这个内置格式化程序查看对象内存并知道如何在不运行程序中的任何代码的情况下重建实际字符串以供显示。在这种情况下,不应修改字符串的内容。

早期版本(和 gdb)可能会在您的程序中运行代码来格式化字符串,并且程序可能会在此过程中发生一些变化。已经做了很多工作来确保不会发生这种情况,但这种可能性是存在的。

Enrico 怀疑内置的 python 格式化程序函数NSString可能在您的程序中以某种方式出现异常,并提供在您重新调用格式化程序时会发生变化的字符串摘要。请在http://bugreport.apple.com/提交错误报告,并详细说明如何重现此行为。

于 2013-05-20T07:02:43.077 回答