在启用弧的应用程序中重构#ifndef __OBJC_GC_

Posted

技术标签:

【中文标题】在启用弧的应用程序中重构#ifndef __OBJC_GC_【英文标题】:refactoring #ifndef __OBJC_GC_ in arc enabled app 【发布时间】:2012-01-17 17:11:07 【问题描述】:

我正在 ARC 环境中编写应用程序,并尝试使用在 ARC 之前编写的第 3 方库。我在所有相关文件上使用 -fno-objc-arc 标志,所以它正在编译,但项目使用 #ifndef __OBJC_GC_ 块来释放内存,这会导致内存分配错误。我正在尝试确定正确的解决方案,到目前为止,我有以下几点:

1.) 找一个不同的库或自己编写 - 这是同类中唯一的免费库,所以这显然不是理想的,而且我还很新,我不喜欢解决这个问题

2.) 删除 #ifndef 块并交叉手指 - 今天无法处理该项目,但这是我的下一个计划

3.) 重构代码以符合 ARC 并删除 -fno-objc-arc 标志

#2 可能有效吗? #3 有多难,它实际上会导致编译器定义 __OBJC_GC_ 吗? (我计划使用大约 4-5 个类,但它们相当大)

【问题讨论】:

在弄清楚库本身正在创建分配错误(不是我的编译器设置错误的事实)之后,我联系了最初编写它的人,他很友好地联系了我到他为 ARC 重写的最新版本,它就像一个魅力。 【参考方案1】:

您说分配块包含在#ifndef __OBJC_GC_ 中。 请注意它是#ifndef - “如果未定义”。

因此,如果作者正确维护了非 GC 版本,它应该可以开箱即用。 您无需删除 ifdef 或伪造它们。

即使启用了 ARC,编译器也不应该为 ios 定义此标志。 只要确保库本身没有明确设置此标志..

【讨论】:

那么带有 ARC 的 iOS 5 不是垃圾收集环境吗?我以为是,但我还没有找到明确的答案。 我又做了一点调试,看来我使用的非arc代码有分配错误,所以这是正确答案。【参考方案2】:

我建议考虑另一种选择:关闭项目的 ARC。

【讨论】:

以上是关于在启用弧的应用程序中重构#ifndef __OBJC_GC_的主要内容,如果未能解决你的问题,请参考以下文章

线程安全的缓冲区数组

#pragma once与#ifndef的区别

C ++链接错误,符号重新定义

#pragma once与 #ifndef的区别

#pragma once与 #ifndef的区别

#ifndef三件套与#pragma once