2015-01-10 6 views
11

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

Спасибо!

+0

Да, вы должны следовать тем же правилам, в Swift, как и в Objective C – sapi

+0

Благодаря! Значит ли это, что я должен также освободить CGImageRef? У меня есть следующие две строки кода: var imageRef = CGBitmapContextCreateImage (контекст); var image = UIImage (CGImage: imageRef) Должен ли я также выпускать imageRef? – user2732722

+0

@sapi Вы уверены, что соответствуют тем же правилам? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html – rakeshbs

ответ

18

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

Core Foundation objects returned from annotated APIs are automatically memory managed in Swift—you do not need to invoke the CFRetain, CFRelease, or CFAutorelease functions yourself. If you return Core Foundation objects from your own C functions and Objective-C methods, annotate them with either CF_RETURNS_RETAINED or CF_RETURNS_NOT_RETAINED. The compiler automatically inserts memory management calls when it compiles Swift code that invokes these APIs. If you use only annotated APIs that do not indirectly return Core Foundation objects, you can skip the rest of this section. Otherwise, continue on to learn about working with unmanaged Core Foundation objects.

When Swift imports APIs that have not been annotated, the compiler cannot automatically memory manage the returned Core Foundation objects. Swift wraps these returned Core Foundation objects in an Unmanaged structure.

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

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

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

func CGBitmapContextCreate(...) -> CGContext! 

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

7

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

'CGContextRelease' is unavailable: Core Foundation objects are automatically memory managed

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

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

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

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