综述
之前看到很多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
- 每一种打印错误下的字典又分为
“蓝牙未连接”
和“缺纸”
,“热敏错误”
等等
- 打印图片,文字,都属于描述同一个大类的错误域名