8

剛剛更新到Xcode的Beta 4的,並與我下面的代碼,發現了以下編譯器錯誤:斯威夫特:CGPathRelease和ARC

var path = CGPathCreateMutable() 
... 
CGPathRelease(path) 

「CGPathRelease」是不可用:核心基礎對象是 自動內存管理

所以,我只是簡單地刪除我的發佈呼叫,一切都應該罰款?還是有更多我失蹤?有什麼特殊情況我應該注意到ARC?

回答

19

使用斯威夫特與可可和Objective-CWorking with Cocoa Data Types節說(重點煤礦):

核心基礎,從註釋的API返回的對象會被自動存儲在Swift- 你不需要管理調用CFRetainCFReleaseCFAutorelease自己的功能。如果您從您自己的C函數和Objective-C方法返回Core Foundation對象,則CF_RETURNS_RETAINEDCF_RETURNS_NOT_RETAINED對它們進行註釋。

...

當斯威夫特進口沒有被註解的API,編譯器不能自動內存管理返回的Core Foundation對象。 Swift將這些返回的Core Foundation對象封裝在Unmanaged<T>結構中。

所以是的,除非你有一個Unmanaged結構,這是正確的,你不必擔心手動釋放對象。

+0

正是我需要的,謝謝。 –

+0

@jtbandes如何確定是否註釋了CF函數? – zaph

+0

@Zaph如指南中所述,檢查'CF_RETURNS _...'的C頭文件中的函數的定義,或者'Unmanaged'的Swift頭文件的定義。 – jtbandes

0

正如接受的答案說:是的,你根本不需要CGPathRelease


注:如果你在你的代碼中使用Unmanaged<T>,檢查the accepted answer

+0

我很困惑,爲什麼你給這個問題添加了一個答案,重複完全相同的事情,然後鏈接到本頁的答案?也許你打算把這個帖子發佈到別的地方? –

+0

@EpicByte它的方式更短,並刪除了許多用戶不需要的所有技術信息(我認爲)。我會重新排列接受的答案,但那會踩到腳趾,所以我會離開另一個版本。但是,既然你是OP,如果你想讓我刪除它,我會很高興。 –

+1

所有的好處,我只是想,也許你打算在另一個問題上發佈。 –