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

标签 ios objective-c pointers nserror

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

相关文章:

ios - SWRevealController 滑动手势

iphone - 在 NSThread 中使用 Singleton 同步数组

ios - 使用 3D 坐标的 SCNShape

objective-c - 清除/释放数组数组的正确方法

c - 何时对数组使用指针与使用访问运算符的通用规则是什么?

c - Free() 指向 Struct 的指针,位于 Struct 内部

ios - 更新 UITableViewCell

ios - 启用分页时如何扩展UICollectionView contentSize?

字符* p = "hello"; printf ("%c %c %c %c", *p, *++p, *p++, *p);

iOS日期格式转换