为什么 &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
限定符来避免这种情况。
考虑以下程序:
#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
限定符来避免这种情况。