考虑以下计划:
#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
会评估两个不同的值?
答案 0 :(得分:2)
ARC正在创建一个自动释放的临时对象并传递该地址,然后在function
返回后将其分配给强object
变量。
请参阅Ownership Inference: Indirect parameters,了解为什么function
的参数被推断为__autoreleasing
。请参阅Passing to an out parameter by writeback以了解ARC创建临时的原因。
我相信你可以在__strong
的参数上声明一个明确的function
限定符来避免这种情况。