About NSError

综述

之前看到很多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
    • 每一种打印错误下的字典又分为“蓝牙未连接”“缺纸”“热敏错误”等等

你可能感兴趣的:(About NSError)