Objective-C的"異常"機(jī)制不同與其他語言台谍。
ARC下默認(rèn)情況不是“異常安全的”。如果拋出異常吁断,那么就是本應(yīng)該在作用域末尾釋放的對象現(xiàn)在卻不會自動釋放了趁蕊。如果想生成“異常安全”的代碼,需要打開編譯器的標(biāo)志“-fobjc-arc-exceptions”仔役,但額外引入的代碼掷伙,不拋出異常時也執(zhí)行。
MRC下受待釋放資源多或代碼執(zhí)行路徑復(fù)雜等情況骂因,很難寫出拋出異常不會導(dǎo)致內(nèi)存泄露的代碼炎咖。
Objective-C所采用的辦法:只有在極其罕見的情況下拋出異常,異常拋出后寒波,無須考慮恢復(fù)問題乘盼,應(yīng)用程序也應(yīng)該退出。也就是不用再編寫“異常安全”的代碼了俄烁。
不那么嚴(yán)重的錯誤時绸栅,Objective-C的編程范式為:令方法返回nil/0,或是使用NSError,以表明有錯誤發(fā)生页屠。
// 返回nil 表明有錯誤發(fā)生
- (id)initWithValue:(id)value
{
if ((self = [super init])) {
if (/* value 不能創(chuàng)建對象 */) {
return nil;
} else {
// 初始化對象
}
}
return self;
}
NSError對象封裝三條信息:
Error domain:錯誤范圍粹胯,類型為字符串蓖柔,通常用一個特有的全局變量來定義。
Error code:錯誤碼 類型為整數(shù)风纠,指明在某個范圍具體發(fā)生何種錯誤况鸣,通常采用enum來定義。
User info:用戶信息竹观,類型為字典镐捧,錯誤的額外信息。
NSError的常見用法
通過委托協(xié)議傳遞此錯誤臭增。委托方法不是非得實現(xiàn)懂酱。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
經(jīng)由方法的“輸出參數(shù)”返回給調(diào)用者。
- (BOOL)doSomething:(NSError**)error;
注意:
參數(shù)是一個指針誊抛,該指針又指向另外一個指針列牺,那個指針指向NSErro對象∞智裕可以把它當(dāng)成一個直接指向NSErro對象的指針瞎领。
ARC下,編譯器把NSError**轉(zhuǎn)換成NSError*__autoreleasing*并炮,指針?biāo)傅膶ο髸诜椒▓?zhí)行完畢后自動釋放默刚。
// 使用
NSError *error = nil;
BOOL ret = [object doSomething:&error];
if (error) {
}
//if (ret) {
//
//}