我有一個應用程序工作得很好。然後我嘗試將導航控制器嵌入到tabbarcontroller中,接下來我知道我在編譯期間開始出現這些錯誤。ios - '自動釋放不可用'錯誤和'ARC禁止自動釋放顯式消息'錯誤
有人會知道爲什麼會發生這種情況嗎?一些設置是否未經檢查或意外檢查?
謝謝, 亞歷克斯
我有一個應用程序工作得很好。然後我嘗試將導航控制器嵌入到tabbarcontroller中,接下來我知道我在編譯期間開始出現這些錯誤。ios - '自動釋放不可用'錯誤和'ARC禁止自動釋放顯式消息'錯誤
有人會知道爲什麼會發生這種情況嗎?一些設置是否未經檢查或意外檢查?
謝謝, 亞歷克斯
看來你以前工作的代碼沒有使用ARC,現在你試圖把它嵌入到它使用ARC代碼...使用重構代碼「編輯 - >型轉換>轉換爲對象-C ARC「
錯誤在新代碼上?
在這種情況下,我認爲您的項目已啓用ARC,當您嘗試嵌入UINavigationController
時,您插入了一些非ARC代碼。
你是否改變了編譯器?
LLVM編譯器引入了ARC。如果你正在開發一個非ARC項目,也許你只是使用LLVM進行編譯而且破壞了你的代碼。
嘗試重構代碼。 Check this.
每個翻譯都啓用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。
謝謝。我剛剛嘗試過,它告訴我不能這樣做,因爲有一些錯誤。要查看錯誤,我必須在常規預置窗格中選擇「在錯誤後繼續構建」。但我不確定哪個窗格是。有任何想法嗎? – Genadinik
這意味着你的代碼是複雜的重構嚮導,你有 - 不幸 - 手動重構代碼:( –
@馬丁,所以我應該怎麼做才能正確設置?我應該註釋掉所有錯誤的聲明?或其他東西? – Genadinik