ARC - 隐式桥接

loc*_*ope 5 objective-c automatic-ref-counting

如果我理解正确,我们可以将void*归类为"C可保持指针类型". 因此,将它隐式桥接到Objective-C对象.但是,编译器会引发需要显式桥接的错误.

   const void * somePtr = (void *)0x12345678;
   - (void)someMethod:(id)sender
   {
        NSObject *obj = (NSObject *)somePtr;
   }
Run Code Online (Sandbox Code Playgroud)

此外,我检查了空指针常量,它编译时没有明确的桥接.

    NSObject *obj = (void *)0;
Run Code Online (Sandbox Code Playgroud)

我正在使用XCode 4.5(Clang 4.1(标签/ Apple/clang-421.11.66)(基于LLVM 3.1svn)).


问题: 我知道向NSObject分配一些任意/不相关的指针有点奇怪,但我想确保是否正确理解规则.我对"C可保持指针类型"有点怀疑.描述; 特别是关于(可能是合格的)和(可能是限定词)的意图.我们可以将哪些指针类型归类为"C可保持指针类型"?

此外,它实际上是指系统中的"系统全局变量"声明的全局变量吗?


3.3.2.转换为具有已知语义的表达式的可保留对象指针类型 [从Apple 4.0开始,LLVM 3.1]

表达式已知为保留不可知,如果它是:

  • Objective-C字符串文字,
  • 来自const系统全局变量的C可保持指针类型的加载,
  • 或空指针常量.

如果强制转换操作数未知或已知保留不可知,则转换将被视为__bridge强制转换.

7.8.C可保留的指针类型

如果类型是指向(可能是限定的) void或指向(可能是限定符)结构或类类型的指针,则类型是C可保留指针类型.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

loc*_*ope 2

看来const系统全局变量实际上不需要显式桥接。即 kCFBooleanTrue(CFBoolean 实例)、kCFNumberNaN 或 kABPersonPhoneMobileLabel。

NSObject *obj = (NSObject *)kCFBooleanTrue;
Run Code Online (Sandbox Code Playgroud)

请注意,CFBoolean 不是免费桥接的,但编译器仍可以隐式桥接它。我定义了全局常量,但无法使用隐式桥接来编译它们。所以,我想知道编译器如何确定变量是否来自系统?(或者可能是检查类型是否来自 CoreFoundation.framework,这不是一个简洁的解决方案......)

- - 编辑 - -

参考罗布·梅奥夫的回答,我尝试了隐式桥接,但仍然不起作用。可能有一个编译器标志来确定该文件为 Core Foundation 文件。

NSObject *obj = (NSObject *)myGlobal;
Run Code Online (Sandbox Code Playgroud)

“mytest.h”文件

#ifndef mytest_h
#define mytest_h

#pragma clang arc_cf_code_audited begin

typedef const struct MyStruct * MyStructPtr;

CF_EXPORT
const MyStructPtr myGlobal;

#pragma clang arc_cf_code_audited end
#endif
Run Code Online (Sandbox Code Playgroud)

“mytest.c”文件

#include "mytest.h"

struct MyStruct {
    int a;
};

static struct MyStruct __myglobal = { 123 };
const MyStructPtr myGlobal = &__myglobal;
Run Code Online (Sandbox Code Playgroud)

- - 编辑 - -

我还修改了 CoreFoundation.framework 中的 CFNumber.h 头文件并删除了CF_IMPLICIT_BRIDGING_ENABLED/CF_IMPLICIT_BRIDGING_DISABLED,然后清理/构建项目,但它没有禁用这些常量的隐式桥接。