美文网首页
关于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

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

  • 第三十一章 Swift Error

    Swift Error只是个协议,不能直接使用传地址的方式传递协议Error,他可以通过as与NSError互相转...

  • 按值传递与按引用传递

    按值传递 -- 传递的是参数的值,即参数本身。 按引用传递 -- 传递的是指向参数的值的引用(指针),而不是参数的...

  • golang 结合实例更好的理解参数传递和指针

    关于参数传递 其实go的参数传递,核心就是一句话:go里所有参数传递都是值传递,既把参数复制一份放到函数里去用。 ...

  • eos.cdt升级到1.4.1

    前天,我看到别人的合约能传递string[]参数,而我传递时,报错Error 3015004: The type ...

  • 值传递or引用传递

    javascript都是按值传递 javascript的函数的参数传递,传递的都是值,参数是 Object 类型的...

  • 方法参数

    一、参数传递 1.参数传递有两种类型:按值传递和按引用传递。 2.按值传递指变量使用的是参数传递的值,而按引用传递...

  • fastapi教程翻译(二十):Path Operation C

    您可以将几个参数传递给路径操作装饰器以对其进行配置。 警告 注意这些参数直接传递到 路径装饰器,而不是传递到 路径...

  • 《Swift进阶》ReadingNotes_5

    inout: inout修饰的参数只能传递lvalue,inout参数会变量优化成引用传递。而不是传入传出时的复制...

  • jQuery中eq和get方法

    eq方法中不管传不传参数都是返回jq实例,而get方法中不传递是返回数组,传递参数返回this[index]

网友评论

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

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