2011-06-08 63 views
39

當試圖同時建立在Xcode 4.2使用自動引用計數我的應用程序使用-retain-release-dealloc,我得到一個錯誤這樣的:在自動引用計數下,爲什麼不允許保留,釋放和dealloc?

自動引用計數禁止「的dealloc」的 明確的消息發送

爲什麼我看到這個錯誤?在自動引用計數下不再允許-retain,-release-dealloc

+0

您是否找到另一種解決方案? – 2015-04-03 11:50:17

回答

67

基本上:

當使用弧,它是全部或沒有。編譯器正在爲你管理所有的retain/releases/deallocs,或者它什麼也不做。你不能散佈你自己的電話給他們,因爲編譯器想自己做這一切。通過這樣做可以做出荒謬的優化(例如,在手動內存管理下返回自動釋放對象的方法現在可能會生成永遠不會在自動釋放池中結束的對象)。如果你開始在自己的調用中保留和釋放,那麼編譯器將不得不使用它們,並且不能執行它想要的許多優化(並且你應該想要)。

作爲額外的獎勵,調用-retainCount現在是一個編譯器錯誤!哦,快樂的一天!

+1

這是否意味着您不能在使用ARC的項目中使用使用保留或釋放的框架?如果編譯器取消用戶的「手動」保留/釋放調用,用它自己的*替換它,以便它允許先前的代碼或外部庫被編譯到ARC項目中,那麼這會不會更好? – AliSoftware 2011-06-20 22:20:46

+0

@AliSoftware是的,你仍然可以使用這些框架。 'retain' /'release'的問題是在編譯時,而不是運行時。 – 2011-06-20 22:29:00

+4

Thx Dave的精度......但那麼外部代碼怎麼樣(有些時候誤用語言錯誤地稱爲「框架/庫」,但是更多的是「未編譯的代碼包」),比如ASIHTTPRequest,Reachability.h /.m等? (這正是我正在考慮的) – AliSoftware 2011-06-21 07:37:26

1

迴應AliSoftware:我們CNA混合ARTC和非ARC框架,也弧和非ARC源。

(我做到了..)

的基本思路是: 1)編譯器會插入/刪除通話是一個非常,非常好的可可程序員可以做 2)可可無論如何C代碼,所以我們有單獨的編譯,所以鏈接器CAN鏈接由多個源生成的二進制文件。認爲它,我們可以混合asm和可可,或C和pascal ...

在主意見Appleadvantege在C#/ java是在這裏:我們總是允許混合,並且,使用COMPILER技術8non運行時。 )我們可以超越表現。

1

在自動引用計數下,不允許保留,釋放和釋放。

如果你有一個現有的代碼,你可以像使用-fno-objc-arc一樣繼續使用它,你可以在任何文件上選擇性地禁用ARC。

如果你想對多個文件禁用ARC:

選擇在目標/構建階段/編譯源代碼在Xcode PRESS ENTER所需的文件。 (雙擊只選擇一個文件) 類型-fno-objc弧 按Enter鍵或完成

0

正如我在answer已經指出了Xcode ARC,你可以編譯具體源文件爲非ARCDave DeLong的回答有點不合適。它不包括這樣一個事實,即您可以指示編譯器在啓用ARC的項目中(如解釋here)將源編譯爲非ARC