一般我们经常见到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并没有影响,也就达不到我们想要的目的。
其他类型对象,包括基本数据类型,都是可以通过传递变量地址来达到这种效果
表达可能有些啰嗦,不如内存图来的易懂,(暂时没有合适的画图工具),后续有时间再补个图吧。有问题大家再一起交流。
网友评论