gpt4 book ai didi

objective-c - ARC-- 隐式桥接

转载 作者:太空狗 更新时间:2023-10-30 03:52:41 26 4
gpt4 key购买 nike

如果我理解正确的话,我们可以将 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(标签/Apple/clang-421.11.66)(基于 LLVM 3.1svn))。


问题:我知道将一些任意/不相关的指针分配给 NSObject 有点奇怪,但我想确保我是否正确理解了规则。我对"C retainable pointer type". 描述有点怀疑;特别是关于(possibly qualified)(possibly qualifier) 的意图。我们可以将哪些指针类型归类为“C 可保留指针类型”

另外,"system global variable" 语句实际上是指来自系统的全局变量吗?


3.3.2. Conversion to retainable object pointer type of expressions with known semantics [beginning Apple 4.0, LLVM 3.1]

An expression is known retain-agnostic if it is:

  • an Objective-C string literal,
  • a load from a const system global variable of C retainable pointer type,
  • or a null pointer constant.

If the cast operand is known unretained or known retain-agnostic, the conversion is treated as a __bridge cast.

7.8. C retainable pointer types

A type is a C retainable pointer type if it is a pointer to (possibly qualified) void or a pointer to a (possibly qualifier) struct or class type.

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

最佳答案

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

NSObject *obj = (NSObject *)kCFBooleanTrue;

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

--- 编辑 ---

引用rob 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,然后清理/构建项目,但它没有禁用这些常量的隐式桥接。

关于objective-c - ARC-- 隐式桥接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com