使用 expression 命令除錯 UI 問題
阿新 • • 發佈:2018-12-21
通過試圖偵錯程式可以解決開發中的大部分 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 修改為透明的,繼續執行,發現問題解決了。