About NSError

作者: 黑羽肃霜 | 来源:发表于2016-05-26 08:52 被阅读630次

    综述

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

    相关文章

      网友评论

      • 我本善良:NSError的属性由于都是Readonly,直接传入方法作为参数的话,方法内部不能进行任何的属性赋值,也就没有任何意义;所以只能让NSError重新初始化操作(调用实例或者类方法),在方法内部改变指针变量的指向,那么外部的NSError对象只能是双指针。
        实质:外部参数为指针变量,调用方法参数中有指针变量,如果在调用方法内部改变指针的指向,那么外部的指针变量只能为双指针。
        黑羽肃霜:受教了!之前的认识只是单纯的从应用的角度来考虑的,并没有认识到本质

      本文标题:About NSError

      本文链接:https://www.haomeiwen.com/subject/ezatdttx.html