2014年1月27日 星期一

Xcode 中斷點的可攜性

在程式碼裡,經常可以看到:工程師為了驗證想法、隨時監控系統…等原因,而在程式碼之間嵌入列印 log 的敘述。例如:

log.info("name變數的值為:" + name);  // Java
NSLog(@"name變數的值為:%@", name);  // Objective-C

這個作法有什麼問題嗎?簡單講,對於閱讀程式碼的人,多少會造成閱讀感的不流暢;其次, log 的列印會影響程式的執行速度、增加不必要的大量歷史記錄。(除非執行環境有被妥善的區分)

至於習於使用 preprocessor 的程式風格,例如以 #if .. #endif 來區分執環境…這種程式碼就更…醜。個人覺得要激怒程式碼未來的維護者(也可能是自己),這個風格的效果應該不錯。

Xcode 的中斷點機制能以更好的方式來滿足上面的需求。

我們可以在建置中斷點後,在其上方以右鍵/雙指點擊的方式呼叫功能選單,並選擇「Edit Breakpoint ...」後,我們可以透過:

1. 將 Action 選擇為「Log Message」
2. 以上面的例子為例,就在 Action 下方文字列輸入:

name變數的值為:@name@

3. 選擇「Log Message to console」
4. 選擇 Options 為「Automatically continue after evaluating」

完成以上步驟後,在執行過程中就會將 log 資訊列印到 console ,效果和加上列印 log 敘述是一樣的,而且不會有因為加上該敘述造成程式碼的閱讀負壓。


故事只講完開場,這篇文章要關注的重點是接下來的內容:

在最基本的要求下,我們會把程式碼在 iteration / refactoring 的過程中,增量式地保存到 repository 裡。(目前 Xcode 預設使用 Git )

那麼,我們在上文中,對於中斷點設置的詳細內容,會跟著 commit 到 Git 裡,然後當下一次不管誰、在哪一台主機裡將程式碼 clone/pull 時,他得到的程式碼中,還會含帶該中斷點的設定嗎?

答案是:如果使用 Xcode 提供的 commit 功能選單,來進行程式碼保存的操作時,將不會把中斷點設置資訊一併存入 Git。更具體地說,在專案的

專案名稱.xcodeproj /xcuserdata/使用者名稱.xcuserdatad/xcdebugger/ 目錄裡

.xcbkptlist 檔,並沒有被保存至 Git 的原因。

解決方式:

自行輸入 git add 及 git commit  。這樣 xcbkptlist 檔才會被存到 Git,而中斷點的設定才具被「可攜性」哦!

對了,Xcode 的中斷點設置,其功能還不只如此!要讓它講話、唱歌都行。
這個就讓讀者自行 play 一下囉 ~




沒有留言:

張貼留言