CGImageRelease в Swift
В Objc я использую метод CGImageRelease
после обработки изображения. Но в Swift этот метод недоступен.
В документации Apple после Retaining and Releasing Images
есть 2 Objective-C symbols hidden
Мой вопрос: почему в Swift нет более CGImageRelease
? И нужно ли нам вызвать другой метод, чтобы заменить его?
Спасибо!
Ответы
Ответ 1
CGImage
теперь управляется ARC. CGImageRelease()
больше не требуется. Вы можете это узнать, посмотрев в CGImage.h и отметив, что он включает макрос CF_IMPLICIT_BRIDGING_ENABLED
. Это указывает на то, что Apple проверила этот файл, чтобы убедиться, что он соответствует соглашениям об именах управления памятью, поэтому ARC может управлять памятью объектов, возвращаемых из функций в этом файле.
EDIT: Я читал это и понял, что я вводил в заблуждение. Я не хочу сказать, что CGImageRelease
не требуется в ObjC (это в значительной степени то, что я подразумевал здесь...) Я просто имею в виду, что из-за аудита Swift способен справиться с этим. В коде ObjC вам все равно нужно освободить эти объекты.
Ответ 2
В Swift больше нет CGImageRelease, и нет другого способа его заменить.
- Swift использует исключительно ARC, поэтому нет места для вызова CFRelease или __bridge_retained.
- Для типов, возвращаемых из C-функций, мы можем вызвать takeRetainedValue()/takeUnretainedValue(), чтобы получить значение, управляемое Swift.
- С макросом CF_IMPLICIT_BRIDGING_ENABLED, который включает Clang arc_cf_code_audited, Swift может обрабатывать управление памятью для возвращаемого значения
Подробные сведения: https://nshipster.com/unmanaged/