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可保留指针类型.
看来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,然后清理/构建项目,但它没有禁用这些常量的隐式桥接。
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |