2013-07-01 26 views

回答

6

看來你以前工作的代碼沒有使用ARC,現在你試圖把它嵌入到它使用ARC代碼...使用重構代碼「編輯 - >型轉換>轉換爲對象-C ARC「

+1

謝謝。我剛剛嘗試過,它告訴我不能這樣做,因爲有一些錯誤。要查看錯誤,我必須在常規預置窗格中選擇「在錯誤後繼續構建」。但我不確定哪個窗格是。有任何想法嗎? – Genadinik

+0

這意味着你的代碼是複雜的重構嚮導,你有 - 不幸 - 手動重構代碼:( –

+0

@馬丁,所以我應該怎麼做才能正確設置?我應該註釋掉所有錯誤的聲明?或其他東西? – Genadinik

1

錯誤在新代碼上?

在這種情況下,我認爲您的項目已啓用ARC,當您嘗試嵌入UINavigationController時,您插入了一些非ARC代碼。

你是否改變了編譯器?

LLVM編譯器引入了ARC。如果你正在開發一個非ARC項目,也許你只是使用LLVM進行編譯而且破壞了你的代碼。

嘗試重構代碼。 Check this.

+0

錯誤在現有代碼上。我真的沒有太大的改變。我做的唯一改變是在故事板上。 – Genadinik

+1

嘗試禁用ARC。檢查這個答案:http://stackoverflow.com/questions/7837024/how-to-disable-xcode4-2-automatic-reference-counting – Edu

4

每個翻譯都啓用ARC - 每個編譯的源文件以及它通過包含查看的所有內容都必須遵守ARC或MRC。是的,這些模式可以共存(也就是說,您可以在某些文件上使用ARC,但不是所有文件都可以使用,並且您鏈接的庫也可以使用)。

你有兩種模式:

ARC

表達[obj autorelease]是被禁止的。 ARC會爲你添加它(除非你有不尋常的引用計數序列)。

在通常情況下,你可以這樣寫:

// a method which returns an autoreleased object 
- (NSArray *)something 
{ 
    return [[NSArray alloc] initWithObjects:…YOUR_OBJECTS…]; 
} 

然後ARC將添加autorelease爲您服務。

但是,如果你寫:

- (NSArray *)something 
{ 
    return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease]; 
} 

在ARC,這將是一個編譯錯誤(如一個在您的標題)。

MRC

這是MRC形式:

- (NSArray *)something 
{ 
    return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease]; 
} 

你的項目很可能默認使用ARC(即它在xcconfig定義,在項目層面,或在目標級別),儘管您已經添加了爲MRC編寫的源文件。

由於文件編譯爲ARC,因此可以刪除autorelease消息或disable ARC for the single file

+0

所以我應該剛剛閱讀該autorelease部分?這能解決問題嗎? – Genadinik

+0

@Genadinik如果這個源文件仍然被另一個項目使用,你應該在禁用ARC的情況下編譯它(因爲'他們'在沒有ARC的情況下編譯它,你會通過刪除它們依賴的ref計數操作來引入問題。如果該文件未在其他項目中使用,請繼續並刪除它(如果遷移失敗)。雖然它們非常罕見,但請注意不尋常的引用計數操作。 – justin