劍未配好,出門已是江湖包吝。
? ? ? 最近一直沒有更新簡書是因?yàn)樵陂_發(fā)和測試階段,有任務(wù)源葫,沒有進(jìn)行學(xué)習(xí)诗越,不過在做任務(wù)的時(shí)候也遇到了一些技術(shù)點(diǎn),在這里總結(jié)一下息堂。
? ? ? 今天我們來談一談?Xcode調(diào)試的技巧嚷狞。?就像玩游戲,有些玩家他們知道怎么操作荣堰,會(huì)放技能會(huì)走路床未,但是他們不知道買裝備,玩了一局下來振坚,鞋子小刀都沒有買薇搁,這樣行走江湖很危險(xiǎn)啊渡八!所以我們出門要把裝配佩戴好啃洋,學(xué)會(huì)裝備自己才是王道传货!
? ? ? 本文將簡書和各大博客上邊涉及該方面的內(nèi)容進(jìn)行匯總,并試圖進(jìn)行全方位的總結(jié)宏娄,如果有什么不足之處還希望大家給提出來问裕,我會(huì)進(jìn)行補(bǔ)充和修改。現(xiàn)在我們開始吧孵坚。
? ? ? ?總體看來粮宛,關(guān)于調(diào)試的方法包括以下幾個(gè):?日志輸出&LLDB、斷點(diǎn)十饥、性能窟勃、一些小技巧等幾個(gè)大的方面。我們一一進(jìn)行學(xué)習(xí)和總結(jié)逗堵。
? ? ? ?嘗試接受新鮮事物和方法秉氧,方法都是熟能生巧的,各種方法綜合運(yùn)用蜒秤,用好了會(huì)事半功倍汁咏。
1、?日志輸出&LLDB
? ? ? ?關(guān)于日志輸出作媚,我們最先想到的是NSLog攘滩,但是弊端在于我們需要在想要打印的位置添加NSLog代碼并重新運(yùn)行項(xiàng)目,這樣耽誤時(shí)間纸泡,所以我們平時(shí)用的比較多的是打斷點(diǎn)漂问,然后po一下。這個(gè)“po”就是LLDB里面的一句命令女揭。
? ? ? ?那么蚤假,什么是LLDB呢:它是一個(gè)有著 REPL 的特性和 C++ ,Python 插件的開源調(diào)試器。LLDB 綁定在 Xcode 內(nèi)部吧兔,存在于主窗口底部的控制臺(tái)中磷仰。調(diào)試器允許你在程序運(yùn)行的特定時(shí)暫停它,你可以查看變量的值境蔼,執(zhí)行自定的指令灶平,并且按照你所認(rèn)為合適的步驟來操作程序的進(jìn)展。我們可以簡單的理解成它是一個(gè)調(diào)試器箍土。
? ? (1)LLDB命令行
? ? ? ?像下圖中逢享,我們打斷點(diǎn)后,控制臺(tái)右邊里面會(huì)出現(xiàn)一個(gè)“l(fā)ldb”吴藻,我們平時(shí)不怎么關(guān)注它拼苍,但我們一直在使用它。
? ? ? <1> ?help命令
? ? ? 斷點(diǎn)的時(shí)候,我們在控制臺(tái)右邊lldb后邊輸入一個(gè)“help”疮鲫,然后敲回車吆你,就會(huì)看到所有關(guān)于lldb的命令以及各自的介紹,如下圖:
? ? ? <2> ?print命令
? ? ? ?print很好理解俊犯,就是打印妇多,使用過程中我們可以直接用p來代替print。
? ? ? ?<3> ?expression命令
? ? ? ? 該命令可以改變程序?qū)嶋H參數(shù)的值燕侠,目的是方便了調(diào)試:不用重新運(yùn)行項(xiàng)目者祖。例如下圖中,我們簡單的做一個(gè)測試绢彤,令蘋果=1七问,橘子=2,all應(yīng)該=3茫舶,在斷點(diǎn)過程中械巡,我們用expression命令修改了橘子的值,令橘子=5饶氏,結(jié)果再打印all的時(shí)候讥耗,all=6(親測好使)。使用過程中我們可以直接用
expr來代替expression疹启。
? ? ? ? 這里我們注意到一個(gè)“$9”古程,這里的9是我們使用lldb命令的次數(shù),例如下圖喊崖,我們expression一次橘子挣磨,po了一次all,再print橘子的時(shí)候荤懂,顯示的是“$11”趋急,說明我們print命令是$10。這個(gè)不用管势誊,只是提醒我們一下而已,作用應(yīng)該不是很大谣蠢。
? ? ? ?<4> ?po命令
? ? ? ? 現(xiàn)在我們來看看平時(shí)用的比較多的“po”粟耻,它是“print object”的簡寫。po一下眉踱,我們就可以看到對象的詳細(xì)信息挤忙。po使用的比較多,使用起來也比較簡單谈喳、方便册烈,這里不做多余的介紹。
? ? ? ? <5> ?image命令
image list 查看工程中使用的庫
image lookup --address? 0x000000010e0979ac ?程序崩潰的時(shí)候定位,查看具體報(bào)錯(cuò)位置
? ? ? ?這個(gè)其實(shí)我們可以想辦法用在我們崩潰日志的收集里面赏僧,這樣的話我們就可以直接定位到崩潰信息的具體位置了大猛。(親測,不好使淀零。感覺xcode反饋的崩潰信息不準(zhǔn)確挽绩。)
? ? ? ?<6> ?call命令
? ? ? ? call即調(diào)用的意思。上述的po和p也有調(diào)用的功能驾中。所以一般只在不需要顯示輸出唉堪,或方法無返回值的時(shí)候使用call。 和上面的命令一樣肩民,我們依然在viewDidLoad:里面設(shè)置斷點(diǎn)唠亚,然后在程序中斷的時(shí)候輸入下面的命令:
call ?[self.view setBackgroundColor:[UIColor redColor]]
? ? ? ? 繼續(xù)運(yùn)行程序,看看view的背景顏色是不是變成紅色的了持痰!在調(diào)試的時(shí)候靈活運(yùn)用call命令可以起到事半功倍的作用(親測好使)灶搜。
(2)LLDB調(diào)試欄
? ? ? 一般的按鈕和功能我們用的比較多,也比較熟悉共啃,這里我們著重介紹一下Debug View Hierachy和xcode8新增的memory graph功能占调。
? ? ? <1>Debug View Hierachy
? ? ? ?Debug View Hierachy,翻譯過來就是:調(diào)試視圖層次移剪。除了點(diǎn)擊控制臺(tái)出的圖標(biāo)究珊,也可以從菜單中選擇Debug > View Debugging > Capture View Hierarchy 來啟動(dòng)視圖調(diào)試。(我們可以看出xcode開發(fā)人員的用心之處:重疊在一起的長方形纵苛,我們大概就明白這個(gè)按鈕是表示層級關(guān)系的)在斷點(diǎn)或者不是斷點(diǎn)的情況下都可以通過點(diǎn)擊這個(gè)按鈕查看視圖層級關(guān)系剿涮。點(diǎn)擊按鈕,我們會(huì)在xcode最頂端的地方看到下圖的一個(gè)信息:
? ? ? ?capture user interface for YourAppName:capture是捕獲的意思攻人,interface取试,face我們知道是臉,inter是進(jìn)入的意思怀吻,interface就是進(jìn)入臉瞬浓,我們大概能夠明白這句話的意思就是“為你的app捕獲用戶交界面”。
從左到右控件排序:(上圖中也簡單解釋了各個(gè)功能)
調(diào)整視圖間距:調(diào)整不同視圖間的間距蓬坡。
展示被剪切的內(nèi)容:當(dāng)前展示視圖中被剪切的部分猿棉。
展示約束:展示選中視圖的約束。
重置查看區(qū)域:將3D渲染透視圖恢復(fù)至默認(rèn)狀態(tài)屑咳。
調(diào)整查看模式:選擇性地展示3D渲染透視圖萨赁,比如僅展示內(nèi)容,僅展示框架以及同時(shí)展示內(nèi)容和框架兆龙。
縮姓人:縮小3D渲染透視圖
恢復(fù):將3D渲染透視圖恢復(fù)至默認(rèn)尺寸。
放大:放大3D渲染透視圖
調(diào)整可視視圖范圍:隱藏視圖或展示視圖,一步步解析3D渲染視圖慰安,向左或者向右滑動(dòng)滑塊兒有相反的效果腋寨。
? ? ? ?有了這個(gè)圖層關(guān)系,我們可以很清楚的知道頁面上邊的各個(gè)控件的位置關(guān)系泻帮,因?yàn)槲覀冊陂_發(fā)階段?尤其是測試階段精置,某個(gè)控件上邊的字不顯示,或者控件的字被遮擋锣杂,我們可以用視圖調(diào)試器查看脂倦,是否控件是frame設(shè)置的不合理。
? ? ? ? <2>memory graph
? ? ? ? 【經(jīng)驗(yàn)1】
? ? ? ? 這個(gè)是xcode8新增的功能元莫,翻譯過來的意思就是:內(nèi)存圖赖阻。有了內(nèi)存圖我們就可以解決閉包引用循環(huán)問題了。舉個(gè)栗子踱蠢,我們寫個(gè)循環(huán)引用火欧,如下:
? ? ?(說實(shí)在的,這幾個(gè)命令我在終端不知道怎么調(diào)用茎截,試了半天苇侵,還是沒有搞出來,應(yīng)該就是內(nèi)存圖調(diào)試的樹狀結(jié)構(gòu)企锌。如果有誰在終端里面知道怎么搞出來榆浓,煩請告訴我一下具體怎么操作凛膏,謝謝了7尴睢)所以,這里我們直接看這個(gè)memory graph按鈕點(diǎn)擊后的效果吮旅。
? ? ? 【經(jīng)驗(yàn)2】? ?
? ? ? ?說明1:這個(gè)功能是xcode8新增的功能抖坪,那么xcode7上邊肯定找不到萍鲸!而xcode8還要10.11.5以上的系統(tǒng),所以擦俐,建議大家先把升級電腦系統(tǒng)脊阴,然后安裝xcode8。
? ? ? ?說明2: ?真機(jī)的話還需要iOS9或者10的系統(tǒng)蚯瞧。
? ? ? ?說明3:查找當(dāng)前默認(rèn)Xcode.app的developer路徑---終端命令行:xcode-select -p嘿期。
? ? ? ? ? ? ? ? ? ? 如果安裝了多個(gè)版本的xcode工具,可以使用xcode-select命令指定命令行指令使用哪個(gè)版本xcode下的developer目錄下的調(diào)試工具状知,即修改路徑:xcode-select --switch /Applications/Xcode2.app/Contents/Developer。
? ? ? 踩過的坑:
? ? ? <1>本來我用的是xcode7.2孽查,挺好用饥悴,結(jié)果在xcode7上邊顯然沒有這個(gè)按鈕,升級到xcode8吧。
? ? ? <2>同事airdrop傳來的xcode8.0和xcode8.1西设,結(jié)果提示安裝不上瓣铣,需要升級電腦的系統(tǒng)。
? ? ? <3>升級好了系統(tǒng)贷揽,安裝好了同事airdrop傳來的xcode8.0不顯示棠笑。(!準(zhǔn)備開始抓狂 ?G菪鳌)難道需要8.1才行蓖救?!
? ? ? <4>安裝好了同事airdrop傳來的xcode8.1印屁,依舊不顯示循捺。(!P廴恕从橘!抓狂!4∧啤G×Α)難道是?打開xcode時(shí)候的路徑不對?旗吁!
? ? ? <5>修改打開xcode的路徑為xcode8.1踩萎,依舊不顯示。(早已經(jīng)料到是這個(gè)結(jié)果了)難道是xcode安裝的太多了阵漏?驻民!
? ? ? <6>卸載掉xcode7.0.1、7.2履怯、7.3回还、8.0,只剩下一個(gè)8.1叹洲,依舊不顯示柠硕。(淡定的接受這個(gè)結(jié)果)難道是同事傳的xcode包有問題?运提!在App Store上自己下載;热帷!
? ? ? ? <7>?下載好了民泵,安裝好了癣丧,依舊不顯示。(?生無可戀了栈妆。胁编。厢钧。)
? ? ? ? 就在此時(shí),我不知道是被逼瘋了還是靈光一閃嬉橙,拿了同事的真機(jī)運(yùn)行項(xiàng)目早直,結(jié)果居然有了memory graph按鈕!J锌颉O佳铩!
當(dāng)你認(rèn)為最困難的時(shí)候枫振,恰恰也就是你最接近成功的時(shí)候喻圃!
當(dāng)你放棄的時(shí)候,你永遠(yuǎn)不會(huì)知道你離成功是那么的接近蒋得!
成功很簡單级及,就是在你堅(jiān)持不住的時(shí)候,再堅(jiān)持一下额衙!
所以建議使用memory graph功能之前確保:
升級電腦系統(tǒng)并安裝xcode8.1饮焦。(8.1比8.0更穩(wěn)定)(這里其實(shí)并不非得是App Store自己下載,別人用airdrop傳的也行)
真機(jī)iOS系統(tǒng)在9.0以上窍侧。
? ? ? 【經(jīng)驗(yàn)3】
? ? ? ?當(dāng)你點(diǎn)擊這個(gè)按鈕以后县踢,xcode上邊的狀態(tài)條會(huì)顯示下圖:
? ? ? ?Capturing memory graph for YourAppName:翻譯過來就是正在捕捉你的app內(nèi)存圖。
? ? ? ?來來來伟件,我們先來看看這狗東西......不是硼啤,是點(diǎn)擊后的效果圖??????
? ? ? 我想說,這是啥玩意斧账?谴返!
? ? 【經(jīng)驗(yàn)4】
? ? ?在解釋上邊圖結(jié)構(gòu)和各個(gè)圖標(biāo)表示的含義之前我們先來看看這幾個(gè)嘆號(hào)分別代表什么。
紅色嘆號(hào):這個(gè)最常見咧织,Error=錯(cuò)誤嗓袱。
黃色嘆號(hào):這個(gè)也常見,Warning=警告习绢。
紫色嘆號(hào):這個(gè)不常見渠抹,不過使用了memory graph我們就會(huì)經(jīng)常見到,Runtime Issue=運(yùn)行時(shí)問題闪萄。
藍(lán)色箭頭:這個(gè)是檢查內(nèi)存泄露是見到的梧却,靜態(tài)分析Command+Shift+B就可以看見。Static Analyzer Issue=靜態(tài)分析的問題败去。
紅色叉叉:這個(gè)實(shí)在instruments里面Leaked用法的時(shí)候見到過放航。UI Test Failed=UI測試失敗。
在memory graph狀態(tài)下我們點(diǎn)擊左邊的嘆號(hào)圆裕,就會(huì)看到RunTime Issue:
? ? ? 【經(jīng)驗(yàn)5】
? ? ? ?在解決這個(gè)紫色嘆號(hào)之前我們先來看看右邊灰色三棱錐广鳍、藍(lán)色正方體缺菌、綠色圓圈等等都代表的是什么。
綠色的一般都是 UIKit 控件及其子類
藍(lán)色一般 NSObject 類及其子類
黃色一般都是容器類型及其子類
灰色括號(hào)是指 block
? ? ? 當(dāng)然還有很多一些其他的類型,具體的大家去看右上角的 Memory Inspect 界面就好,上面都會(huì)有詳細(xì)的信息搜锰。
? ? 【經(jīng)驗(yàn)6】
? ? ? 當(dāng)我們在某一個(gè)塊上邊點(diǎn)擊右鍵的時(shí)候,會(huì)彈出一個(gè)選項(xiàng)框耿战,里面有5個(gè)選項(xiàng):
Quick Look:快速查看蛋叼,和上圖中的小眼睛功能一樣。
Print Description:打印詳細(xì)信息剂陡,和上圖小眼睛右邊的按鈕功能一樣狈涮。
Jump To Definition:跳至代碼區(qū)。
Reveal in Debug Navigator:在左邊的內(nèi)存樹狀結(jié)構(gòu)中標(biāo)藍(lán)色鸭栖。
Focus on Node:在節(jié)點(diǎn)上關(guān)注歌馍,點(diǎn)擊后只剩下跟自己前后箭頭相關(guān)的節(jié)點(diǎn)node。
? ? ? ? 一開始進(jìn)入首頁的時(shí)候晕鹊,只展示tabbar上邊的四個(gè)controller松却。而當(dāng)我們想要看某個(gè)頁面的memory graph的時(shí)候,我們需要在真機(jī)上邊跳到那個(gè)頁面溅话,然后再點(diǎn)擊memory graph按鈕晓锻,才能在左邊的樹狀結(jié)構(gòu)中找到想要看的頁面的controller。
? ? ? 【經(jīng)驗(yàn)7】
? ? ? ? 和紅色飞几、黃色嘆號(hào)一樣砚哆,紫色嘆號(hào)出來了,我們就要想辦法解決掉屑墨,那么我們看看項(xiàng)目中的紫色嘆號(hào)都標(biāo)記在哪里了呢躁锁?
? ? ? ?各種Reachability啊B咽贰U阶!好不容易找到這個(gè)memory graph按鈕程腹,好不容易看明白點(diǎn)了內(nèi)存圖匣吊,好不容易找到了紫色嘆號(hào),你踏瑪?shù)赂嬖V我這個(gè)錯(cuò)誤是因?yàn)樘O果自己的Reachability造成的4缌省IА!(生無可戀见转。命雀。。斩箫。吏砂。撵儿。。狐血。淀歇。。匈织。浪默。。缀匕。纳决。。乡小。)紫著吧阔加。
2、斷點(diǎn)
斷點(diǎn)里面根據(jù)作用和功能也有很多種類:普通斷點(diǎn)满钟、條件斷點(diǎn)胜榔、異常斷點(diǎn)、符號(hào)斷點(diǎn)等湃番。我們一一學(xué)習(xí)介紹苗分。
(1)普通斷點(diǎn)(不帶技能就出去闖蕩江湖的)
? ? ? ? 當(dāng)程序運(yùn)行到斷點(diǎn)處時(shí)會(huì)暫停運(yùn)行。比如斷點(diǎn)打在11行牵辣,那么程序就會(huì)停在11行(注意:程序只運(yùn)行到了前10行摔癣,第11行其實(shí)還沒有被執(zhí)行。)纬向。只要在代碼行旁邊點(diǎn)擊择浊,就能添加一個(gè)斷點(diǎn),再次點(diǎn)擊逾条,斷點(diǎn)變成淺藍(lán)色琢岩,就能讓斷點(diǎn)不可用(disable了,仍然存在师脂,只是不起作用了)担孔。
(2)條件斷點(diǎn)(帶上技能再闖蕩江湖)
打上斷點(diǎn)之后,對斷點(diǎn)進(jìn)行編輯吃警,設(shè)置相應(yīng)過濾條件糕篇。單擊右鍵會(huì)彈出選項(xiàng)框:
Edit BreakPoint... :編輯斷點(diǎn)。
Disable? BreakPoint :斷點(diǎn)失效酌心。(相當(dāng)于上邊說到的單擊斷點(diǎn)變成淺藍(lán)色拌消,斷點(diǎn)失效)
Delete BreakPoint :刪除斷點(diǎn)。
Reveal in BreakPoint Navigator :在左邊的斷點(diǎn)樹狀結(jié)構(gòu)表明該斷點(diǎn)安券。
這里我們主要用到的是第一個(gè):Edit BreakPoint墩崩。這里面設(shè)置斷點(diǎn)的篩選條件(雙擊斷點(diǎn)也可以快速進(jìn)入編輯斷點(diǎn)的對話框)氓英。
【1】Condition:返回一個(gè)布爾值,當(dāng)布爾值為真觸發(fā)斷點(diǎn)鹦筹,一般里面我們可以寫一個(gè)表達(dá)式铝阐。
【2】Ignore: ? ? ?忽略前N次斷點(diǎn),到N+1次再觸發(fā)斷點(diǎn)铐拐。
【3】Action: ? ? ?斷點(diǎn)觸發(fā)事件饰迹,分為六種:
? ? ? ? ? ?<1> ?AppleScript:執(zhí)行腳本。
? ? ? ? ? ?<2> ?Capture GPU Frame:用于OpenGL ES調(diào)試余舶,捕獲斷點(diǎn)處GPU當(dāng)前繪制幀。?
? ? ? ? ? ?<3> ?Debugger Command:和控制臺(tái)中輸入LLDB調(diào)試命令一致锹淌。
? ? ? ? ? ?<4> ?Log Message:輸出自定義格式信息至控制臺(tái)匿值。
? ? ? ? ? ?<5> ?Shell Command:接收命令文件及相應(yīng)參數(shù)列表,Shell Command是異步執(zhí)行的赂摆,只有勾選“Wait until done”才會(huì)等待Shell命令執(zhí)行完在執(zhí)行調(diào)試挟憔。
? ? ? ? ? ? <6> ?Sound:斷點(diǎn)觸發(fā)時(shí)播放聲音。
【4】Options(Automatically continue after evaluating actions選項(xiàng)):選中后烟号,表示斷點(diǎn)不會(huì)終止程序的運(yùn)行绊谭。
【1】Condition:這里我設(shè)置i==6,我們看LLDB控制臺(tái)打印結(jié)果:
這里打印了0-5汪拥,然后斷點(diǎn)斷了达传。這樣做的目的就是我們不用在循環(huán)里面一個(gè)一個(gè)的點(diǎn)擊下一步,直接跳至我們想要看到的那一步迫筑。
【2】Ignore:這里我把Condition的條件取消宪赶,設(shè)置Ignor的條件為3,我們看LLDB控制臺(tái)打印結(jié)果:
結(jié)果是將0-2的循環(huán)直接忽略脯燃,而后邊的循環(huán)依舊每次在斷點(diǎn)的位置斷一次搂妻。
(3) ?異常斷點(diǎn)?Exception Breakpoint(全局?jǐn)帱c(diǎn))
? ? ? 異常斷點(diǎn)可以快速定位不滿足特定條件的異常,比如常見的數(shù)組越界辕棚,這時(shí)候很難通過異常信息定位到錯(cuò)誤所在位置欲主。這個(gè)時(shí)候異常斷點(diǎn)就可以發(fā)揮作用了。
? ? ?添加異常斷點(diǎn):
? ? ? ? 同樣的逝嚎,全局?jǐn)帱c(diǎn)也是可以編輯的扁瓢,單擊右鍵或者雙擊斷點(diǎn)就會(huì)彈出編輯框,編輯的項(xiàng)目和上述是一樣的补君。
(4)符號(hào)斷點(diǎn) Symbolic Breakpoint
? ? ? ? 符號(hào)斷點(diǎn)的創(chuàng)建也同異常斷點(diǎn)涤妒。一般符號(hào)斷點(diǎn)可以在你指定的[類名 方法名]時(shí)中斷執(zhí)行。
3赚哗、性能檢測:
(1)靜態(tài)分析:通過對代碼靜態(tài)分析她紫,找出代碼潛在的錯(cuò)誤硅堆,如內(nèi)存泄漏、空引用贿讹、未使用函數(shù)等渐逃。
? ? ? ? ? ? ? ? 方法:菜單“Product"->"Analyze"或者Shift+Command+B,然后想辦法消滅藍(lán)箭頭民褂。
(2)動(dòng)態(tài)分析:通過Instruments工具跟蹤分析程序運(yùn)行時(shí)的數(shù)據(jù)
? ? ? ? ? ? ? ? 方法:參考《Instruments性能檢測》
4茄菊、其他小技巧
? ? ? ?(1)模擬器調(diào)試:FPS
? ? ? ? 在《Instruments性能檢測》一文中我們就介紹了FPS=Frame Per Sencond:?一秒鐘渲染多少幀。
? ? ? ? 根據(jù)蘋果全球開發(fā)者大會(huì)WWDC的說法赊堪,當(dāng)FPS低于45時(shí)面殖,用戶就會(huì)察覺滑動(dòng)有卡頓。
? ? ? ? 編譯并運(yùn)行應(yīng)用程序哭廉,選中模擬器脊僚,從 Debug菜單中選擇Color Blended Layers選項(xiàng)。
紅色:表示這些layer是透明的遵绰,系統(tǒng)在渲染這些像素點(diǎn)的時(shí)候辽幌,需要將該view及view一下的其他view混合之后才能得到實(shí)際的顏色。紅色越深椿访,表明系統(tǒng)在渲染的時(shí)候越費(fèi)勁乌企。
綠色:表示這些layer是不透明的,易于渲染成玫。
黃色:表示這里的點(diǎn)無法直接繪制在屏幕上加酵,此時(shí)系統(tǒng)需要對相鄰的像素點(diǎn)做反鋸齒計(jì)算,增加了圖形負(fù)擔(dān)哭当。產(chǎn)生的原因是這個(gè)控件的背景是通過圖片拉伸得到的虽画。
所以推薦盡可能地使用不透明的圖層。
? ? ? (2) 真機(jī)調(diào)試:截圖荣病。
? ? ? ?當(dāng)我們在模擬器上邊運(yùn)行項(xiàng)目的時(shí)候码撰,想要給產(chǎn)品或者測試人員看一下頁面效果如何,qq截圖就可以了个盆,如果在真機(jī)上呢怎么截圖呢脖岛?一般我們會(huì)拿著真機(jī)給產(chǎn)品或者測試人員看看,但是如果來回折騰很麻煩颊亮,我們也可以用自己的手機(jī)照相然后發(fā)圖片給他們柴梆,這里還有一個(gè)更好的辦法對真機(jī)進(jìn)行截圖:運(yùn)行項(xiàng)目,選擇Debug--View Debugging--Take Screenshot of 真機(jī)名字终惑,這樣在你的電腦桌面上邊就會(huì)有一張你的真機(jī)上邊選好頁面的截圖绍在。
參考:1、iOS各種調(diào)試技巧豪華套餐
? ? ? ? ? ?2、iOS調(diào)試之LLDB
? ? ? ? ? ?3偿渡、Xcode8調(diào)試黑科技:Memory Graph實(shí)戰(zhàn)解決閉包循環(huán)引用問題
? ? ? ? ? ?4臼寄、iOS開發(fā)之Xcode常用調(diào)試技巧總結(jié)
? ? ? ? ? ?5、Xcode8的Debug新特性---WWDC 2016 Session 410 & 412 學(xué)習(xí)筆記
? ? ? ? ? ?6溜宽、iOS 開發(fā)之個(gè)人調(diào)試技巧
最后吉拳,哪里不對的地方可以給我留言,我會(huì)及時(shí)改進(jìn)的适揉,謝謝大家留攒。