如何在具有C-Structures的项目中将Non ARC转换为ARC项目?

时间:2013-04-01 08:26:18

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

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

Edit-> Refactor->转换为Objective C ARC  但得到错误:

ARC禁止结构或联合中的Objective-C对象

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

2 个答案:

答案 0 :(得分:6)

这里有两个选项:

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

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

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

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

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

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

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

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

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

      比C结构更安全,更连贯,更易于使用。

答案 1 :(得分:0)

target-project => build phases => compile sources => non-arc file => -fno-objc-arc(command)