gpt4 book ai didi

ios - 无法理解 NSError/NSObject 指针传递行为

转载 作者:可可西里 更新时间:2023-11-01 03:55:40 26 4
gpt4 key购买 nike

即使我读过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com