綜述
之前看到很多NSError
的用法,一直頗為費解。這里先拋出兩種常出現的形式來討論
示例一 —— NSError* 定義的對象和 &error
- 比如系統的JSON序列化函數中,NSError是其中一個參數
NSError *err = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic
options:NSJSONWritingPrettyPrinted
error:&err];
我們可以看到,經常我們傳入的 err都是一個地址,再來看函數原型。
+(nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
發現我們要傳入的類型其實是 (NSError**)
其實也就是這個對象指針的指針,也就是指針的地址。
err 是對象,也是對象的指針。所以 &error
對應的也就是 (NSError**)
示例二 —— (NSError**) 和 *error
- 有時候一些自定義的函數,和上面這個JSON序列化的系統函數用的是一樣的格式,傳入的也是
(NSError**)
,比如
-(void)printImage:(UIImage *)image error:(NSError **)error{
if (![self print_Image:image]) { // 表示產生了錯誤
*error = [NSError errorWithDomain:@"Print Error"
code:01
userInfo:nil];
}
}
-
這里
(*error)
其實就是NSError的一個實例化對象。 (error是地址,*error表示地址所在的空間的內容,也就是對象本身) - NSError的三個屬性說明
上面用到這個函數用來初始化一個NSError
對象
[NSError errorWithDomain:@"Print Error" // 域名
code:01 // 錯誤代碼
userInfo:nil] // 字典描述
- 理解這三個屬性其實不大好說,相當于一級一級的往下。比如說
- 打印圖片,文字,都屬于描述同一個大類的錯誤域名
@“Print Error”
- 打印圖片的錯誤代碼
code
為01,打印文字的錯誤代碼為02
- 每一種打印錯誤下的字典又分為
“藍牙未連接”
和“缺紙”
,“熱敏錯誤”
等等
- 打印圖片,文字,都屬于描述同一個大類的錯誤域名