2014-08-28 68 views
6

使用SWIFT可以使用手動內存管理(而不是自動引用計數)編寫應用程序嗎?Swift沒有ARC

我可以使用Swift調用retainrelease嗎?

+0

在我的回答和@newacct答案中提出意見後,我現在想知道:你想避免在你的項目中的* some *對象上使用ARC,或者關閉整個項目的ARC?可以在你的問題中明確說明嗎? – Antonio 2014-08-29 07:38:57

回答

10

您可以Unmanaged<T>值調用retainreleaseUnmanaged基本上是ARC管理之外的對象指針。但是你必須轉換爲託管指針才能與Cocoa API交互。

但是,除非在特殊情況下,否則你不想這樣做。而一個沒有轉化爲ARC的項目並不是這種情況。

1

注意2014年8月29日 - 下面我的答案是不正確的,這是可能的,看看@newacct答案

你就是不行。閱讀更多關於Automatic Reference Counting

你必須有一個很好的理由不想ARC

+3

沒有真正的原因 - 只是cuirious – YogevSitton 2014-08-28 06:50:38

+1

好的。害怕你想做一些奇怪的事情:) – Antonio 2014-08-28 06:51:54

+0

我正在研究一個非ARC項目,我想知道如果我可以添加Swift代碼而不必將其轉換爲ARC項目。 – YogevSitton 2014-08-28 06:54:00

0

目前沒有辦法以objc的方式(例如,帶有編譯器標誌的每個文件)關閉ARC for swift。正如其他人指出的那樣,有一些「非託管」和「不安全的可變指針」API用於與C API交互,它允許您在某些情況下解決ARC問題。但是,這些API非常麻煩,需要對代碼進行重大更改(例如,與數組進行交互)。

Swift的人通常會希望你重寫你的代碼來使用結構並儘可能避免引用問題。但是這使得移植現有的代碼變得很痛苦。

在我的另一篇文章中有關於ARC性能的一些建議在這裏:Swift Dictionary slow even with optimizations: doing uncessary retain/release?但沒有一個是非常令人滿意的。

我已經寫了代碼來後處理編譯後的mach-O目標代碼,並從實驗中刪除了某些類的ARC swift_retain/release調用。但我真的希望現在Swift是開源的,我們可以修改它以使其在未來更加靈活。