【问题标题】:How to convert Non ARC to ARC project while project having C-Structures?项目具有 C 结构时如何将非 ARC 转换为 ARC 项目?
【发布时间】:2013-04-01 08:26:17
【问题描述】:

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

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

ARC 禁止在结构或联合中使用 Objective-C 对象。

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

【问题讨论】:

    标签: objective-c ios6 automatic-ref-counting


    【解决方案1】:

    你有两个选择:

    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 结构更安全、更连贯且更易于使用。

    【讨论】:

    • 感谢转换为 ARC 工作正常,但结构化对象没有保留值,这就是应用程序开始崩溃的原因
    • 我理解将 C 结构转换为目标 c 类要安全得多,但我使用了第二个选项,例如 typedef struct { NSInteger anInteger; __unsafe_unretained NSString * aString; } 结构体;因为它真的很难在整个项目中改变。
    【解决方案2】:

    target-project=>构建阶段=>编译源=>非arc文件=>-fno-objc-arc(command)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多