2013-04-01 34 views
4

我有一个Xcode 4.5.1。我想将此项目转换为ARC以改善性能。我正在执行这些步骤。如何在具有C结构的项目中将非ARC转换为ARC项目?

编辑 - > Refactor->转换成Objective C的ARC 但得到的错误:

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

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

回答

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下编译,它是你必须保持一个C结构内Objective-C对象的唯一选择。请记住,ARC不会管理这些对象的内存,所以你已经手动处理它

底线,我的建议是将您的C结构转换为类。举个例子,你可以轻松地将上面的结构为:

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

这是更安全,更连贯,更容易比C结构使用。

+0

感谢转换为ARC工作得很好,但结构化对象没有保留价值,多数民众赞成为什么应用程序开始崩溃 – Archive

+0

我明白将C结构转换为更安全的目标c类,但我使用了类似于typedef的第二个选项struct NS {int anInteger; __unsafe_unretained NSString * aString; } AStruct;因为它在整个项目中很难改变。 – Archive

+0

你应该显示一些代码 –

0

目标项目=>建立阶段=>编译源代码=>非arc文件=> - FNO-objc弧(命令)