2013-05-19 20 views
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包含我期望的內容,其他行包含期望字符串末尾的垃圾。

我不理解這個不斷變化的垃圾是如何在這裏,當我應該是在調試器的暫停。 還有一件事是,我只有泰語纔有這種問題。

有沒有人有什麼可以怎麼回事的想法?

回答

0

這看起來像在的NSString數據格式的錯誤。 你在Xcode 4.6上嗎?如果是這樣,我會喜歡它,如果你提交了一個對Xcode的錯誤儘可能多的上下文。 我的猜測是有一些緩衝區管理不當。

0

當您使用p命令,有幾種不同的事情LLDB可以做。

對於簡單的混凝土類型(intint *),它只能打印變量(10,0xffffffff83021600)中的值。它可能有一個格式化程序首選項集(例如,以十六進制顯示int)。它可能有一個更復雜的python格式化程序(它可以讀取內存的不同部分並向您呈現對象的高級視圖)。最後,它實際上可以在程序中運行代碼,以獲得該變量的高級視圖。

在這種情況下,使用Xcode 4.6,這看起來像是一個簡單的NSString ivar,所以期望lldb可以使用其內置的Python格式化程序來處理NSString對象。該內置格式化程序查看對象內存,並知道如何重新構建顯示的實際字符串,而無需在程序中運行任何代碼。在這種情況下,字符串的內容不應該被修改。

早期版本(和gdb)可以在你的程序格式化字符串運行代碼,它是可能的方案可以在這個過程中變化不大。有很多工作可以確保不會發生,但存在這種可能性。

恩里科被懷疑爲NSString內置蟒蛇格式化功能,可以在你的程序以某種方式行爲不端並且提供一個改變,因爲你再調用格式化字符串摘要。請在http://bugreport.apple.com/上提交錯誤報告,並提供有關如何重現此行爲的詳細信息。

+0

在這種情況下,最好是給我做一個小程序,以使簡單的解釋。對於人們來說也很容易閱讀。 – Michel

+0

我遵循了上述建議,構建了一個示例項目並製作了一個錯誤報告。 – Michel

+0

太棒了!這是確保它得到解決的最好方法 - 我認爲別人沒有遇到這個問題。 –