如果我理解正确,我们可以归类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
虽然这不是你链接的文件中指出,相信“一个的“系统”部分const
系统的全局变量”的意思,而编译变量定义clang arc_cf_code_audited
已生效。
看看顶部CFNumber.h
,你会发现这一点:
CF_IMPLICIT_BRIDGING_ENABLED
而临近年底,你会发现这一点:
CF_IMPLICIT_BRIDGING_DISABLED
这些宏定义在CFBase.h
开始和结束的clang arc_cf_code_audited
编译,就它的定义。
看来,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,再用干净的/生成项目,但它并没有禁用这些常数隐桥。