en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

11.28.2011

關於 Assert 的二三事

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 中使用中斷點除錯的一些基本技巧ㄧ文。







沒有留言:

張貼留言