2013-04-01 98 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弧(命令)