为什么 &object 在 Objective-C 中计算出两个不同的值?

Why does &object evaluate to two different values in Objective-C?

考虑以下程序:

#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 计算出两个不同的值?

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

请参阅 Ownership Inference: Indirect parameters to see why function's parameter is inferred to be __autoreleasing. See Passing to an out parameter by writeback 了解 ARC 为什么创建临时文件。

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