利用Cocoa Layout Instrument檢視自動(dòng)布局
前段時(shí)間,MarkD跟我們探討了Instruments里面很多有用的診斷工具,比如TimeProfiler和Energy Diagnostics template。同理,在這里我將提供一個(gè)Cocoa布局工具(CocoaLayoutInstrument)的綜述。
為了有助于探索,這里我創(chuàng)建了一個(gè)簡單的示例。這是一個(gè)利用AutoLayout來布局UICollectionView以及其UICollectionViewCell內(nèi)容的iPhone應(yīng)用。這里下載帶有跟蹤輸出的示例工程,下面開始。
CocoaLayoutInstrument可以應(yīng)用于iOS模擬器和Cocoa桌面應(yīng)用,但是不能和連接的iOS設(shè)備一起使用。CocoaLayoutInstrument提供了一個(gè)與NSLayoutConstraint類的實(shí)例有關(guān)的所有事件的時(shí)間軸,這一點(diǎn)和回溯(backtrace)很像。蘋果在AnalysisTools相關(guān)的文檔中介紹了該工具。
怎樣啟動(dòng)Instrument?
執(zhí)行下面的步驟,開啟CocoaLayoutInstrument
1.打開示例工程
2.選擇Product>Profile(快捷鍵)
3.選擇Cocoa布局模板
4.Instruments窗口將會(huì)顯示出來并且為暫停狀態(tài),點(diǎn)擊左上角紅色的記錄按鈕()
5.滑動(dòng)圖片,然后點(diǎn)擊暫停按鈕結(jié)束事件的記錄。
在這篇文章的余下部分中,為了instructions和結(jié)果適配,我將使用我提供的回溯。跟我一樣的話,請打開cocoa-layout-instrument.trace文件。
在這里能看到什么?
時(shí)間軸下面的行所列出的一連串事件詳情,如下圖所示,統(tǒng)稱為NSLayoutConstraint對(duì)象的影響。所有的影響事件都按時(shí)間順序列出,***的事件在***部。每個(gè)事件包含了以下信息:
-
Caller:哪一個(gè)類和方法觸發(fā)了一個(gè)約束的改變
-
Constraint:這一欄是回溯(trace)真正的血肉組成。通過約束(Constraint)的內(nèi)存地址或者通過標(biāo)識(shí)符屬性(如果可用的話),你能夠辨別出哪個(gè)約束被影響了。Constraint欄也包含了VFL字符串,這個(gè)字符串闡述了坐標(biāo)軸所對(duì)應(yīng)的約束線和約束定義的關(guān)系。
-
Constant:定義約束的常量值。
-
Event:詳細(xì)說明某個(gè)約束被加載了什么樣的操作。這個(gè)約束可能被創(chuàng)建,移除,或者添加到window上面了,或者屬性例如標(biāo)識(shí)符(identifier)被修改或者移除了。這些改變事件包括:
①創(chuàng)建
②添加到窗口
③常量修正
④標(biāo)識(shí)符改變
⑤從窗口移除
過濾過的事件列表和時(shí)間軸
首先,過濾列表,獲取你感興趣的內(nèi)容。在右上角文本框標(biāo)出記錄的數(shù)據(jù)(RecordedData),鍵入0x7ff4e948dce0和0x7ff4e948d6e0。當(dāng)然你的內(nèi)存地址會(huì)不同,這里使用你看到的地址。有趣的是,這個(gè)文本框只過濾VFL字符串和內(nèi)存地址。
現(xiàn)在的列表是這些我們想要的約束,讓我們看一下列表的***個(gè)事件,從第0行開始,(_:attribute:relatedBy:toItem:attribute:multiplier:constant:)方法創(chuàng)建了一個(gè)約束。在列表的約束行,你可以看到構(gòu)成這個(gè)約束的關(guān)系(relationship)和屬性(attributes),UILabel:0x7ff4e948dce0.leading==UIImageView:0x7ff4e948d6e0.leading.意思是,這個(gè)UILabel的對(duì)象頂邊和這個(gè)UIImageView的頂邊相等。在實(shí)現(xiàn)部分,隨著這個(gè)約束的創(chuàng)建,它的標(biāo)識(shí)符屬性馬上會(huì)被設(shè)定。回溯里面輸出的記錄是一個(gè)事件:標(biāo)識(shí)符屬性變?yōu)閟ubtitleLeadingConstraint。
除了通過內(nèi)存地址或者約束值來過濾之外,你還可以關(guān)注事件的一個(gè)子集。點(diǎn)擊水平拖動(dòng)時(shí)間表至頂部,來指定事件的一個(gè)特定的時(shí)間范圍,如上圖所示。和其他的工具集類似,你會(huì)發(fā)現(xiàn)拖動(dòng)左邊的追蹤范圍滑塊來放大堆棧深度(StackDepth),以一窺時(shí)間軸上更細(xì)時(shí)間尺度的事件。
向右拖動(dòng)回溯的比例滑塊進(jìn)一步觀察
其他控制盤和按鈕
讓我們看看這個(gè)工具提供的幾個(gè)附加配置。
為了改變時(shí)間軸上事件的可視化呈現(xiàn),打開記錄設(shè)置面板(),勾選StatisticstoGraph下面的StackDepth選項(xiàng):
記錄設(shè)置面板里時(shí)間軸的相關(guān)可選配置
例如,改變時(shí)間軸的可視風(fēng)格:
修改時(shí)間軸的風(fēng)格
對(duì)于一個(gè)給定的事件,你也可以查看所有導(dǎo)致該事件的堆棧跟蹤信息。首先,選定某個(gè)事件,然后打開詳情擴(kuò)展(ExtendedDetail)面板(?-3)。在工具集窗口的右面板部分,呈現(xiàn)的是這個(gè)特定事件的堆棧追蹤信息。
一個(gè)自動(dòng)布局事件的堆棧追蹤信息
透過表象看本質(zhì)
Instruments的價(jià)值在于,它使我們深刻理解我們代碼的內(nèi)部運(yùn)作。CocoaLayoutInstrument擴(kuò)展了這一點(diǎn)用于自動(dòng)布局,提供了與某個(gè)接口的生命周期有關(guān)的每一個(gè)步驟的豐富細(xì)節(jié)。