Assertion 斷言,它可以幫助程式做判斷的作用,當成程式執行到某個特定時間點,我們可以使用 Assert 斷言它現在是某種狀態,如果斷言的結果為真,程式將繼續執行,某則就發出中斷。在 Objective-C 中使用斷言有以下幾種方式。
NSInteger x = 0;
//斷言x的狀態
assert(x > 20 && "x 應該要大於 20");
NSAssert(x > 20 ,@"x 應該要大於 20");
NSAssert1(x > 20 ,@"x 現在是: %d, x 應該要大於 20", x);
NSCAssert1(x > 20, @"x 現在是: %d, x 應該要大於 20", x);
除了傳統的 assert 外,NSAssert 與 NSCAssert 都可以在後面接上變數來當作參數使用(阿拉伯數字代表後面可以接幾個變數)。
Assertion 斷言的位置也很重要,可以將 Assertion 斷言放在函式的開頭確保所輸入的參數都是正確的,或是放在運算式的結尾來確保得出的結果都在範圍內,當然你也可以用 Assertion 斷言來判斷物件是否為 nil 的狀態。
不過上述所說的 Assertion 斷言使用方式大部份都存在於 Debug 的版本中,如果你的程式已經準備要 Release,可以透過設定 Target 的 Build Settings 來防止編譯器將斷言的程式碼組譯到你的程式裡,在 Build Settings 中找到 Apple LLVM compiler 3.0 - Preprocessing 項目(Xcode 4.2),將 Preprocessor 的 Release 新增一個 NS_BLOCK_ASSERTIONS 值即可,如下圖,之後當你使用 Release 版本進行編譯時程式將不會觸發任何的 assert。
ps:不確定是不是 Xcode 4 編譯器的 bug,在使用 NSAssert 與 NSCAssert 斷言時,Console 裡不會出現斷言的描述,只有檔案與行號,而在程式暫停時程式碼中也不會標示在斷言的該行。
如果你想要在程式暫停時標示斷言的該行程式碼,可以參考以下步驟。
(Xcode 3)
在專案中選點 Run > Show > Breakpoints,並且新增一個 Symbol(Project 表示只針對此專案作的設置,Global 表示對所有專案的設置),之後在 Breakpoint 處填上 objc_exception_throw,在 Location 處填上 libobjc.A.dylib 即可。
(Xcode 4)
案專案中的 Breakpoint Navigator 點選「+」新增一個 Symbolic Breakpoint,並在 Symbol 設定 objc_exception_throw,之後將此 Symbolic Breakpoint 設定到 要作用的區域裡即可。
上述做法請務必開啓中斷點的功能,按下專案上的中斷點按鈕(如下圖),關於更多中斷點的相關資訊,可以參考關於 Xcode 中使用中斷點除錯的一些基本技巧ㄧ文。
沒有留言:
張貼留言