即使我读过 Why does NSError need double indirection? (pointer to a pointer),我现在对指向指针的指针感到困惑和 NSError * vs NSError **等等。
我已经做了一些思考,但仍然有一些问题。
我在这里写了这个:
NSError *error = [NSError errorWithDomain:@"before" code:0 userInfo:nil];
NSLog(@"outside error address: %p", &error];
[self doSomethingWithObj:nil error:&error];
为了测试上面的NSError
方法,我这样写:
- (id)doSomethingWithObj:(NSObject *)obj error:(NSError *__autoreleasing *)error
{
NSLog(@"inside error address: %p", error);
id object = obj;
if (object != nil)
{
return object;
}
else
{
NSError *tmp = [NSError errorWithDomain:@"after" code:0 userInfo:nil];
*error = tmp;
return nil;
}
}
但是我发现这两个日志地址是不一样的。这是为什么?
2016-08-19 19:00:16.582 Test[4548:339654] outside error address: 0x7fff5b3e6a58
2016-08-19 19:00:16.583 Test[4548:339654] inside error address: 0x7fff5b3e6a50
它们不应该相同吗,因为那只是一个简单的值副本?如果它们应该不同,指向指针的指针如何最终指向同一个 NSError
实例?
最佳答案
调用者中的变量类型为 NSError*
。地址的类型为 NSError* *
。函数 expect NSError* __autoreleasing *
。因此编译器创建了一个NSError* __autoreleasing
类型的隐藏变量,在调用前将NSError*
复制到隐藏变量中,调用后复制回来得到语义__autoreleasing 权利。
关于ios - 无法理解 NSError/NSObject 指针传递行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037553/