首先要注意的是:
「自動引用計數」(automatic reference counting,arc,參見第30條)在預設情況下不是「異常安全的」(exception safe)。具體來說,這意味著:如果丟擲異常,那麼本應在作用域末尾釋放的物件現在卻不會自動釋放了。如果想生成「異常安全」的**,可以通過設定編譯器的標誌來實現,不過這將引入一些額外**,在不丟擲異常時,也照樣要執行這部分**。需要開啟的編譯器標誌叫做-fobjc-arc-exceptions。
即使不使用arc,也很難寫出在丟擲異常時不會導致記憶體洩漏的**。
只要發生了可使整個應用程式崩潰的嚴重錯誤時,才應使用異常。異常丟擲之後,無須考慮恢復問題,而且應用程式此時也應該退出。這就是說,不用再編寫複雜的「異常安全」**了。
在錯誤不那麼嚴重的情況下,可以指派「委託方法」(delegate method)來處理錯誤,也可以把錯誤資訊放在nserror物件裡,經由「輸出引數」返回給呼叫者。
或令方法返回nil/0以表明其中有錯誤發生。
nserror物件裡封裝了3條資訊:
1、error domain(錯誤範圍,其型別為字串)
錯誤範圍,也就是產生錯誤的根源,通常用乙個特有的全域性變數來定義。例:nsurlerrordomain來表示錯誤範圍。
2、error code(錯誤碼,其型別為整數)
表明在某一特定的範圍內可能會發生一系列相關錯誤,這些錯誤通常採用enum來定義。
例:http狀態碼
3、user info(使用者資訊,其型別為字典)
有關些錯誤的額外資訊,其中或許包含一段「本地化的描述」(localized description)。或許還含有導致該錯誤發生的另外乙個錯誤,經由此種資訊,可將相關錯誤串成一條「錯誤鏈」(chain of errors)。
nserror經常由「輸出引數」返回給呼叫者。
例:-(bool)dosomething:(nserror**)error
傳遞給方法的引數是個指標,而該指標本身又指向另乙個指標,那個指標指向nserror物件。或者也可以把它當成乙個直接指向nserror物件的指標。
實際上,在使用arc時,編譯器會把方法簽名中的nserror** 轉換成nserror*__autoreleasing*,也就是說,指標所指的物件會在方法執行完畢後自動釋放。這個物件必須自己釋放,因為「dosomething:」方法不能保證其呼叫者可以把此方法中建立的nserror釋放掉,所以必須加入autoreleass。
nserror *error = nil; // 輸出引數
bool ret = [object dosomething: &error];
if(error)
第6條 理解「屬性」這一概念(中)
使用屬性時還有乙個問題要注意,就是其各種特質 attribute 設定也會影響編譯器所生成的訪問方法。比如下面這個屬性就指定了三項特質 1 property nonatomic,readwrite,copy nsstring testfirstname 屬性可以擁有的特質分為四類 在預設情況下,由編...
第八條 理解「物件等同性」這一概念
isequaltostring 比isequal 快,因為後者還要之行額外的步驟,因為它不知道受檢測的物件型別。nsobject協議中有連個用於判斷等同性的關鍵方法 bool isequal id object nsuinterger hash 要點 若想檢測物件的等同性,請提供 isequal 於...