如果我理解正确,我们可以将void *归类为“C 可保留指针类型”。 因此,将其分配给 Objective-C 对象将被隐式桥接。但是,编译器会引发需要显式桥接的错误。
const void * somePtr = (void *)0x12345678;
- (void)someMethod:(id)sender
{
NSObject *obj = (NSObject *)somePtr;
}
另外,我检查了空指针常量,它在没有显式桥接的情况下编译。
NSObject *obj = (void *)0;
我正在使用 XCode 4.5(Clang 4.1(tags/ Apple/clang-421.11.66)(基于LLVM 3.1svn))。
问题: 我知道将一些任意/不相关的指针分配给 NSObject 有点奇怪,但我想确保我是否正确理解了规则。我对“C 可保留指针类型”有点怀疑。描述; 尤其是关于(possibly qualifier)和(possible qualifier)的意图。我们可以将哪些指针类型归类为“C 可保留指针类型”?
另外,它实际上是否意味着“系统全局变量”语句中的系统全局变量?
3.3.2. 转换为具有已知语义的可保留对象指针类型的表达式 [开始于 Apple 4.0,LLVM 3.1]
如果一个表达式是已知的,则它与保留无关:
- 一个 Objective-C 字符串文字,
- 从C 可保留指针类型的 const 系统全局变量加载,
- 或空指针常量。
如果强制转换操作数已知为 unretained 或已知 retain-agnostic,则转换被视为 __bridge cast。
7.8. C 可保留指针类型
如果类型是指向(可能限定的) void 的指针或指向(可能限定符)结构或类类型的指针,则该类型是 C 可保留指针类型。