美文网首页
关于NSError参数传递为什么都是传递&error,而不是er

关于NSError参数传递为什么都是传递&error,而不是er

作者: TheEnded | 来源:发表于2019-03-19 18:37 被阅读0次

    一般我们经常见到NSError作为参数传递,但是为什么是&error,而不是直接使用error?

    一般代码是这样的

    NSError *error = nil;
    BOOL ret = [object doSometing:&error];
    if(error){
        //处理error
    }
    
    - (BOOL)doSomething:(NSError **)p_error{
      if(//something error){
        if(p_error){
        *p_error = [NSErrorerrorWithDomain:domain code:code :userInfo:userInfo];
        return NO;
      }
      return YES;
    }
    

    使用NSError的意图:我们发现这样使用到error的时候,都是需要在后面判断是否有error信息,这样就需要将error传递进去,在处理方法内修改其值,并且还能够返回给调用函数。

    原因:&error传入是传的error指针的地址引用(就是指向error指针的指针),传入后处理函数直接访问变量的地址,在doSomething:方法中,对p_error“解引用”。* p_error,这时候实际上就是调用函数中的error指针,*p_error = xx 实际上就是error = xx; 修改了error的指向,指向了一个新的对象。(内存图画不好,手写的太难看,看文字理解吧)

    如果传入的是error,这时候处理函数中的参数实际上是对error的浅拷贝,指针p_error 和error指向的同一份地址,这时候如果在处理函数中修改p_error = xxx,其实只是将p_error重新指向了xxx.对调用函数中的error并没有影响,也就达不到我们想要的目的。

    其他类型对象,包括基本数据类型,都是可以通过传递变量地址来达到这种效果

    表达可能有些啰嗦,不如内存图来的易懂,(暂时没有合适的画图工具),后续有时间再补个图吧。有问题大家再一起交流。

    相关文章

      网友评论

          本文标题:关于NSError参数传递为什么都是传递&error,而不是er

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