最近工作中碰到了一些問題蓄拣,翻翻查查的都解決了,也學(xué)到了一些東西重罪,記錄下來備忘吧砸泛。
1、斷點(diǎn)調(diào)試時(shí)變量值都為nil蛆封,取不到有效值
問題原因:之前調(diào)試一個(gè)Release版本崩潰時(shí)唇礁,將運(yùn)行模式改為了Release,沒有改回來
Debug和Release區(qū)別:
- Debug:調(diào)試版本惨篱,是面向開發(fā)者的盏筐,只有Debug版本的程序才能使用Trace/Assert等調(diào)試輸出語句
- Release:發(fā)布版本,是面向用戶的砸讳,Debug和Release調(diào)用的是兩個(gè)不同的底層庫琢融,Release版本不包含任何調(diào)試信息,所以體積小簿寂、運(yùn)行速度快
Debug和Release在內(nèi)存分配和釋放方式上是不同的漾抬,Debug模式下內(nèi)存會(huì)延遲釋放,但Release模式下達(dá)到釋放條件的會(huì)立即釋放常遂。只要我們?cè)赬code的Edit Scheme-->Run
中選中了Debug executable
纳令,兩種模式運(yùn)行項(xiàng)目后都是可以打斷點(diǎn)的,但是Release模式下,斷點(diǎn)處的變量信息在控制臺(tái)看到的都是nil平绩,打印輸出的話會(huì)提示variables may not be available
圈匆。因此Release版本下的調(diào)試操作實(shí)際上是沒有任何意義的,調(diào)試結(jié)果也不具有參考價(jià)值捏雌。
2跃赚、UITableView點(diǎn)擊Cell,第一次點(diǎn)擊沒有觸發(fā)tableView:didSelectRowAtIndexPath:方法性湿,第二次可以觸發(fā)
問題原因:
UIScrollView子控件為UITableView的問題纬傲,在官方文檔找到如下解釋:
官方文檔的這段話意思是說:我們不應(yīng)該把UIWebView或者UITableView嵌入到UIScrollView中去使用。如果我們這樣做了肤频,可能會(huì)導(dǎo)致不可預(yù)見的行為發(fā)生叹括,因?yàn)閁IWebView或UITableView對(duì)象和UIScrollView對(duì)象的觸摸事件會(huì)被混在一塊并被錯(cuò)誤的處理。
解決方案:
如果是UITableView的話着裹,將scrollEnabled屬性設(shè)置為YES,這樣能夠讓內(nèi)部的UITableView對(duì)象知道如何去正確處理這個(gè)UIScrollView的滾動(dòng)相關(guān)的觸摸事件米同。但既然官方文檔不建議這么做骇扇,那么還是盡量避免把UIWebView或者UITableView放到UIScrollView中去使用。
3面粮、項(xiàng)目運(yùn)行后控制臺(tái)打出很多l(xiāng)og:
[framework] CUICatalog: Invalid asset name supplied: '(null)'
問題原因:定位到原因是[UIImage imageNamed:]
傳入的參數(shù)為nil少孝。但是有一個(gè)問題,怎么定位到時(shí)哪個(gè)文件的哪些[UIImage imageNamed:]
方法傳入的參數(shù)是nil熬苍。有一個(gè)Symbolic Breakpoint
斷點(diǎn)調(diào)試的方法稍走,可以讓我們?cè)诮鉀Q這類問題時(shí)事半功倍。
1柴底、點(diǎn)擊左下角+
選擇Symbolic Breakpoint...
2婿脸、右鍵斷點(diǎn)選擇Edit Breakpoint...
3、在Symbolic
選項(xiàng)中輸入要調(diào)試的目標(biāo)方法柄驻,比如[UIImage imageNamed:]
4狐树、在Condition選項(xiàng)輸入觸發(fā)目標(biāo)方法斷點(diǎn)的條件,比如$arg3 == nil
運(yùn)行程序鸿脓,如果當(dāng)前界面有調(diào)用目標(biāo)方法抑钟,并且條件滿足,就會(huì)進(jìn)入這個(gè)方法的斷點(diǎn)模式野哭,進(jìn)入Xcode的Debug Navigator選項(xiàng)在塔,查看調(diào)用堆棧,棧頂?shù)姆椒ň褪浅霈F(xiàn)問題的代碼拨黔,直接點(diǎn)擊查看即可蛔溃。
再說一下第4步的$arg3,它代表目標(biāo)方法的第一個(gè)參數(shù)變量。比如有一個(gè)方法- (void)methodSection1:(id)section1 section2:(id)section2 section3:(id)section3{}
城榛,我要調(diào)試這個(gè)方法的話揪利,目標(biāo)方法就是methodSection1:section2:section3:
,$arg
+“數(shù)字”代表的含義是:
-
$arg0
代表self -
$arg1
代表方法名狠持,_cmd
-
$arg3
代表參數(shù)變量section1 -
$arg4
代表參數(shù)變量section2 -
$arg5
代表參數(shù)變量section3
解決方案:給出現(xiàn)問題的方法加上邏輯判斷疟位,避免傳入nil。
4喘垂、gerrit用ssh拉取代碼報(bào)出問題
Unable to negotiate with 10.216.90.129 port 29418: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
問題原因:并不僅僅出現(xiàn)Mac OS系統(tǒng)甜刻,在最新的OpenSSH版本(7.0及更高版本)中,一些老舊的加密算法已經(jīng)默認(rèn)不可用了正勒。當(dāng)客戶端使用SSH連接到服務(wù)器時(shí)得院,如果老舊算法不可用,客戶端和服務(wù)器無法就密鑰交換算法達(dá)成一致而導(dǎo)致連接失敗章贞,報(bào)出上面的錯(cuò)誤提示祥绞。目前服務(wù)器只提供了一種方法:diffie-hellman-group1-sha1。OpenSSH支持此方法鸭限,但是默認(rèn)沒有啟用蜕径,我們要做的就是去啟用它。KexAlgorithms用于生成每個(gè)連接密鑰的密鑰交換方法败京,host下加入KexAlgorithms=+diffie-hellman-group1-sha1兜喻,含義就是使用KexAlgorithms啟用diffie-hellman-group1-sha1密鑰交換算法。
解決方案:
- 修改ssh config文件
sudo vim /etc/ssh/ssh_config
- 在host下加入
KexAlgorithms=+diffie-hellman-group1-sha1