1. 程式人生 > >使用 expression 命令除錯 UI 問題

使用 expression 命令除錯 UI 問題

通過試圖偵錯程式可以解決開發中的大部分 UI 問題。但是對於一些隱蔽得比較深的問題,我們就需要用到 lldb 了。

那麼,怎麼在除錯 UI 問題的過程中,使用 lldb 呢?下面舉一個實際的例子。

在專案中,我們經常會發現自己自定義的 view 會出現一些顯示上的問題,明明設定了 view 的屬性,比如背景色,但在執行時卻發現這個設定並不生效,view 的背景色不會顯示。

這時,可以先開啟檢視偵錯程式,選中這個 view,在檢視偵錯程式的 Object Inspector 面板中你會找到 Address 0x114285910 字樣,這個就是 view 的記憶體地址。

在試圖偵錯程式開啟的情況下,進入 lldb,輸入 e 命令( expression ):

(lldb) e 0x114285910
(long) $34 = 4633155856

命令執行後輸出了第二句,表示將這個地址存入到了 $34 變數,你可以使用這個變數來訪問這個 view 物件了,比如列印它的資訊:

(lldb) po $34
<UIView: 0x114285910; frame = (0 0; 26 26); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x11423d480>>

那麼,我們能不能直接修改這個物件的屬性呢?

(lldb) e [$34 setBackgroundColor:[UIColor redColor]];
error: warning: receiver type 'long' is not 'id' or interface pointer, consider casting it to 'id'
error: no known method '-setBackgroundColor:'; cast the message send to the method's return type

呃,報錯了,說明這招並不好使。你可以先將它轉成一個 UIView 型別:

(lldb) e (UIView*)$34
(UIView *) $35 = 0x0000000114285910

轉換後的物件存入到新的變數 $35。用它來試試:

(lldb) e $35.backgroundColor=[UIColor redColor];
error: property 'backgroundColor' not found on object of type 'UIView *'

看來直接訪問 UIView 的屬性是不行的。我們知道每個 UIView 底層都是一個 CALayer,那麼我們試著訪問它底層的 CALayer 呢?

(lldb) e $35.layer.backgroundColor=[UIColor redColor].CGColor;
(CGColorRef) $36 = 0x0000000117b0c430

看樣子成功了!點選繼續執行按鈕,檢視 view 的背景色,仍然沒有變。

再次點選檢視偵錯程式,拖動檢視,檢視 view 的層次,發現在我們的 view 的背景色實際上已經變成紅色了,只不過在它之上卻有一個背景不透明 UIView,是它擋住了我們的檢視!

用 expression 命令將這個遮擋在上層的 view 修改為透明的,繼續執行,發現問題解決了。