尽管标记了文件 -fno-objc-arc,但 ARC 禁止在结构或联合中使用 Objective-C 对象
Posted
技术标签:
【中文标题】尽管标记了文件 -fno-objc-arc,但 ARC 禁止在结构或联合中使用 Objective-C 对象【英文标题】:ARC forbids Objective-C objects in structs or unions despite marking the file -fno-objc-arc 【发布时间】:2011-12-26 22:40:13 【问题描述】:ARC 禁止在结构或联合中使用 Objective-C 对象,尽管标记了文件 -fno-objc-arc? 为什么会这样?
我假设如果你标记它 -fno-objc-arc 你没有这个限制。
【问题讨论】:
【参考方案1】:如果您收到此消息,请尝试 __unsafe_unretained。只有在结构中的对象未被保留时,它才是安全的。 示例:如果您将 OpenFeint 与 ARC 一起使用,则 OFBragDelegateStrings 类会在结构中显示此错误。
typedef struct OFBragDelegateStrings
NSString* prepopulatedText;
NSString* originalMessage;
OFBragDelegateStrings;
到
typedef struct OFBragDelegateStrings
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
OFBragDelegateStrings;
【讨论】:
它也会在我分配字符串时产生问题,它显示警告将保留对象分配给 unsafe_unretained 变量对象将在分配后释放。当我使用它时它会崩溃 这并不能解决所有问题,对象通常会立即释放,因此不可用。 是的——这实际上不起作用......解决方案是以某种方式关闭 ARC 以获取我还无法弄清楚的派生源文件...... 您可以通过在构建阶段将 -fno-objc-arc 标志添加到文件中来做到这一点。 如果 struct 字段只是一个“哑引用”,并且对象实际上被保留(拥有)在其他地方(例如,在NSArray
内)怎么办?在那种情况下,它不会立即被释放,但我想知道编译器会说什么(现在无法测试)......【参考方案2】:
而不是使用 struct,您可以创建一个 Objective-C 类来管理数据。
【讨论】:
怎么样?样品在哪里? 那么为什么不能为小型用例构建结构呢?【参考方案3】:这是因为 arc 无法跟踪结构或联合中的对象(因为它们当时是纯 C 指针)。
即使您用-fno-objc-arc
标记了有问题的文件/类,您仍可能将由 arc 控制的对象作为参数传递给它,这很可能会导致内存泄漏。
【讨论】:
但是我如何能够在我的项目中使用弧和非弧文件。例如,我使用 sharekit 作为非弧,我可以使用实例来发布。我使用的文件是arc文件。 您可以使用-fno-objc-arc
在项目中混合使用 ARC 和非 ARC 文件,但如果您在任何地方使用普通 C 结构(如 struct 或 union),则根本无法使用 ARC。跨度>
感谢 voidStern.. “但如果你在任何地方使用普通的 C 结构,如 struct 或 union,你根本无法使用 ARC。” - 我不认为这是真的。我将 ARC 用于我自己的文件。 libharu 文件的非弧。我解决原始问题的方法是将值分别传递给 C 文件并在那里创建结构。我认为关键是从圆弧到非圆弧再到圆弧的跳跃。
可能有点夸张。本质上,您不能将指向对象的指针放入结构和联合中,这会使 ARC 感到困惑。应该(通常)使用带有结构和/或联合的普通 C 库。【参考方案4】:
看起来这现在可以正常工作了,可能是在this change 之后。
即,您可以将指向 Objective-C 对象的普通(强)指针放在 C 结构中。它由 ARC 管理,例如,当结构被破坏时它是不保留的。验证:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)
【讨论】:
What's New in LLVM - WWDC 2018以上是关于尽管标记了文件 -fno-objc-arc,但 ARC 禁止在结构或联合中使用 Objective-C 对象的主要内容,如果未能解决你的问题,请参考以下文章