NSError传参
为什么要传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;
新生成了一个指针。但是指针指向的地址都是相同的,所以不影响操作指针地址