ARC - 隐桥(ARC - implicit bridging)

2019-08-03 07:29发布

如果我理解正确,我们可以归类void *的“C可保持指针”。 因此,将其分配给一个Objective-C的对象将被隐式桥。 然而,编译器会引发错误显式桥接是必需的。

   const void * somePtr = (void *)0x12345678;
   - (void)someMethod:(id)sender
   {
        NSObject *obj = (NSObject *)somePtr;
   }

另外,我检查了空指针常数,它编译没有明确的桥接。

    NSObject *obj = (void *)0;

我使用的XCode 4.5(4.1锵(标签/ 苹果/铛-421.11.66)(基于LLVM 3.1svn))。


问:我知道这是一个有点怪异分配一些任意波形/不相干指向NSObject的,但我想确保我是否正确理解规则。 我对“C可保持指针”有点可疑 描述; 特别是约的意图(可能限定)(可能的限定符)。 可能我们将其归类为“C可保持指针”什么指针类型?

此外,它实际上是指从系统的“系统全局变量”声明的全局变量?


3.3.2。 转化成可保留对象的指针类型表达式的与已知的语义 [开始苹果4.0,LLVM 3.1]

表达是已知的保留无关 ,如果它是:

  • 一个Objective-C字符串文字
  • 选自C可保持指针类型的一个const系统全局变量的负载,
  • 或空指针常量。

如果转换操作数是已知的未保留的或已知保留不可知 ,转换被视为__bridge铸造

7.8。 ç可保留指针类型

A型是C可保持指针类型,如果它是一个指向(可能合格)空隙或一个指向一个(可能限定符)结构或类型。

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

Answer 1:

虽然这不是你链接的文件中指出,相信“一个的“系统”部分const系统的全局变量”的意思,而编译变量定义clang arc_cf_code_audited已生效。

看看顶部CFNumber.h ,你会发现这一点:

CF_IMPLICIT_BRIDGING_ENABLED

而临近年底,你会发现这一点:

CF_IMPLICIT_BRIDGING_DISABLED

这些宏定义在CFBase.h开始和结束的clang arc_cf_code_audited编译,就它的定义。



Answer 2:

看来,const的系统全局变量其实并不需要明确的桥接。 即kCFBooleanTrue(CFBoolean实例),或kCFNumberNaN kABPersonPhoneMobileLabel。

NSObject *obj = (NSObject *)kCFBooleanTrue;

需要注意的是CFBoolean没有免费电话桥接但它可以仍然隐含编译器桥接。 我定义的全局常量,但不能让他们与隐桥接编译。 所以,我不知道怎么会编译器确定的变量来自于系统或不? (或者可能是它被检查,如果类型来自CoreFoundation.framework这不是一个巧妙的解决办法...)

---编辑---

参照抢mayoff的答案,我想隐桥,但它仍然没有奏效。 可能有一个编译器标志,以确定该文件为核心的基础文件。

NSObject *obj = (NSObject *)myGlobal;

“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

“mytest.c”文件

#include "mytest.h"

struct MyStruct {
    int a;
};

static struct MyStruct __myglobal = { 123 };
const MyStructPtr myGlobal = &__myglobal;

---编辑---

我在CoreFoundation.framework还修改了CFNumber.h头文件,并删除CF_IMPLICIT_BRIDGING_ENABLED / CF_IMPLICIT_BRIDGING_DISABLED,再用干净的/生成项目,但它并没有禁用这些常数隐桥。



文章来源: ARC - implicit bridging