3

В чем разница между takeUnretainedValue и takeRetainedValue? На основании документации Apple:В чем разница между takeUnretainedValue и takeRetainedValue?

Оба этих метода возвращают оригинальный, развернутый тип объекта . Вы выбираете, какой метод использовать на основе того, вызывает ли API, вызываемый вами , возвращенный неиспользуемый или сохраненный объект.

Но как узнать, неуправляемый объект является незавершенным или сохраненным объектом? Например, метод ABAddressBookCreateWithOptions: от AddressBook framework возвращает неуправляемый объект ABAddressBook, который некоторые учебные пособия рассматривают как сохраняемый объект. При использовании ALAsset метод thumbnail возвращает неуправляемый объект CGImage, который в некоторых учебниках рассматривает это как незавершенный объект.

Буду признателен за вашу помощь.

ответ

6

Как узнать, является ли неуправляемый объект незавершенным или сохраненным объектом?

Это зависит от того, какой API вы используете.

Есть некоторые конвенции здесь: Ownership Polocy/Memory Management Programming Guide for Core Foundation

В принципе, если имя функции содержит слово «Создать» или «Копировать», используйте .takeRetainedValue(). Если имя функции содержит слово «Get», используйте .takeUnretainedValue().

И, если оно не содержит, насколько я знаю, мы все равно можем использовать .takeUnretainedValue() почти в каждом случае.

Однако каждое правило имеет исключение :), например, см:
Swift UnsafeMutablePointer<Unmanaged<CFString>?> allocation and print

+0

это хороший, простой, и-точка объяснение :) Спасибо! Итак, в моем случае, потому что метод 'ALAsset'' someALAsset.defaultRepresentation(). FullScreenImage() 'возвращает неуправляемый' CGImage', тогда я должен использовать '.takeUnretainedValue()', правильно? Я имею в виду, что 'CGImage' не содержит« create »или« copy »в своем конструкторе. –

+0

Правильно, 'fullScreenImage' не содержит« Создать »или« Копировать ». Если вы не знаете, что использовать, вы можете найти несколько примеров кода на apple.com. Например, [этот образец] (https://developer.apple.com/library/ios/samplecode/PrintPhoto/Listings/Classes_PrintPhotoViewController_m.html) использует 'fullScreenImage', но не освобождает результат с' CGImageRelease'. – rintaro