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/