为什么& object在Objective-C中评估两个不同的值?

时间:2018-03-21 13:29:36

标签: objective-c pointers memory-address

考虑以下计划:

#include <objc/nsobject.h>
#include <stdio.h>

void function(NSObject** object) {
  printf("value of NSObject** in function: %p\n", object);
}

int main() {
  NSObject* object;
  printf("value of NSObject** in main:     %p\n", &object);
  function(&object);
}

程序输出(在x86_64上使用-fobjc-arc编译):

  

value of NSObject** in main: 0x7ffee1217668
  value of NSObject** in function: 0x7ffee1217660

为什么价值不相等?它们偏移了8个字节,我发现这是意料之外的。如果我将其更改为普通C类型(例如int**),则它们都会打印相同的值。但是,Objetive-C对象的双指针总是给出不同的值。

这里发生了什么,为什么&object会评估两个不同的值?

1 个答案:

答案 0 :(得分:2)

ARC正在创建一个自动释放的临时对象并传递该地址,然后在function返回后将其分配给强object变量。

请参阅Ownership Inference: Indirect parameters,了解为什么function的参数被推断为__autoreleasing。请参阅Passing to an out parameter by writeback以了解ARC创建临时的原因。

我相信你可以在__strong的参数上声明一个明确的function限定符来避免这种情况。