4

我有一个 Xcode 4.5.1 。我想将此项目转换为 ARC 以提高性能。我正在按照这些步骤操作。

编辑->重构->转换为 Objective C ARC 但出现错误:

ARC 禁止在 structs 或 unions 中使用 Objective-C 对象

  1. 我知道,我可以通过将 -fno-objc-arc 添加到编译器选项来阻止这些类转换为 ARC。但我也想将这些类转换为 ARC。是否可以?
  2. 如何允许 xcode 只检查某些类进行 ARC 转换?例如,当我转换为 arc 时,它会检查类代码,但我有一些类不能转换为 arc。所以希望 Xcode 不应该在转换过程中为它们生成错误。是否可以?
4

2 回答 2

6

您在这里有两个选择:

  1. -fno-objc-arc标志添加到您不想转换为 ARC 的文件中,但当然您不能转换它们,否则在最好的情况下它将无法编译,并且在最坏的情况下会大量泄漏。

  2. 转换所有类并使用 C 结构中的 Objective-C 对象解决问题。

关于第二种解决方案,您还有几个选择:

  1. 用成熟的对象替换 C 结构,让 ARC 为您处理内存

  2. 继续使用 C 结构并标记其中的对象部分,__unsafe_unretained这基本上会告诉 ARC 忽略这些对象进行内存管理。因此,您将拥有类似的东西:

    typedef struct {
        NSInteger anInteger;
        __unsafe_unretained NSString * aString;
    } AStruct;
    

    这将在 ARC 下编译,这是您将 Objective-C 对象保存在 C 结构中的唯一选择。请记住,ARC 不会管理这些对象的内存,因此您必须手动处理它

最重要的是,我的建议是将您的 C 结构转换为类。例如,您可以轻松地将上述结构转换为:

@interface AStructReplacement : NSObject
@property (nonatomic, assign) NSInteger anInteger;
@property (nonatomic, strong) NSString * aString;
@end

这比 C 结构更安全、更连贯且更易于使用。

于 2013-04-04T00:56:09.760 回答
0

目标项目=>构建阶段=>编译源=>非弧文件=>-fno-objc-arc(命令)

于 2014-06-06T09:50:16.370 回答