Вам нужно выпустить CGContextRef в Swift?

Я создал контекст, используя CGBitmapContextCreate. Нужно ли его освобождать с помощью CGContextRelease? Я знаю, что ответ да в Objective-C, но как насчет в Swift?

Благодарю!

Ответы

Ответ 1

CFTypes автоматически управляются, если явно не указано как неуправляемое.
Согласно документации. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

Объекты Core Foundation, возвращенные из аннотированных API, автоматически управляются памятью в Swift - вам не нужно самостоятельно запускать функции CFRetain, CFRelease или CFAutorelease. Если вы возвращаете объекты Core Foundation из собственных C-функций и методов Objective-C, аннотируйте их с помощью CF_RETURNS_RETAINED или CF_RETURNS_NOT_RETAINED. Компилятор автоматически вставляет вызовы управления памятью, когда компилирует код Swift, который вызывает эти API. Если вы используете только аннотированные API, которые не косвенно возвращают объекты Core Foundation, вы можете пропустить оставшуюся часть этого раздела. В противном случае продолжайте изучать работу с неуправляемыми объектами Core Foundation.

Когда Swift импортирует API, которые не были аннотированы, компилятор не может автоматически управлять памятью возвращенных объектов Core Foundation. Swift обертывает возвращаемые объекты Core Foundation в неуправляемой структуре.

Неуправляемые типы будут иметь подпись типа

func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

CGBitmapContextCreate имеет подпись типа

func CGBitmapContextCreate(...) -> CGContext!

Следовательно, он управляется автоматически быстрым.

Ответ 2

Нет, вам не нужно вызывать CGContextRelease. На самом деле, пытаясь дать вам эту ошибку:

"CGContextRelease" недоступен: объекты Core Foundation автоматически управляются памятью

CGContext автоматически управляются памятью в Swift. Вы можете сказать по сигнатуре функции:

func CGBitmapContextCreate(/* several parameters */) -> CGContext!

Возвращаемое значение, которое вам нужно было бы освободить, будет выглядеть так:

func CGBitmapContextCreate(/* several parameters */) -> Unmanaged<CGContext>!