为什么要传NSError **,以及为什么以下输出两个指针地址不一样

代码

- (void)viewDidLoad {
    [super viewDidLoad];
    NSError *error = nil;
    NSLog(@"%p",&error);
    [self testError:&error];
//   [self testError:<#(NSError *__autoreleasing *)#>];
    NSLog(@"error %@",error);
}


- (void)testError:(NSError **)error {
    NSLog(@"%p",error);
    *error = [NSError errorWithDomain:@"" code:200 userInfo:nil];
}

输出结果

0x16db93ec8
0x16db93ec0
error Error Domain= Code=200 "(null)"

1.为什么要传**,

  • 首先,一个*,是指针指向的地址,也就是指向的对象内存地址
  • 两个*,**是指针的指针地址,执行NSError *error = nil 后,只有指针,而没有内存地址。
*error = [NSError errorWithDomain:@"" code:200 userInfo:nil];

这段代码的含义就是取error的指针地址,并指向一个内存 以上知识来自大学c语言

2.为什么输出两次地址不同

因为传参时,参数的内存会被新的指针持有。 arc下

[self testError:<#(NSError *__autoreleasing *)#>];

相当于

NSError *__autoreleasing tempError = error;

新生成了一个指针。但是指针指向的地址都是相同的,所以不影响操作指针地址