【问题标题】:Why does &object evaluate to two different values in Objective-C?为什么 &object 在 Objective-C 中评估为两个不同的值?
【发布时间】:2018-03-21 13:29:35
【问题描述】:

考虑以下程序:

#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 对象的双指针总是给出不同的值。

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

【问题讨论】:

    标签: objective-c pointers memory-address


    【解决方案1】:

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

    查看Ownership Inference: Indirect parameters 了解为什么function 的参数被推断为__autoreleasing。请参阅 Passing to an out parameter by writeback 了解 ARC 为何创建临时文件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2019-05-24
      相关资源
      最近更新 更多