takeUnretainedValue
和takeRetainedValue
之间的区别是什么?基于Apple的文档:
这两种方法都返回原始的,未包装的类型 宾语。您可以根据API是否选择使用哪种方法 正在调用返回一个未保留或保留的对象。
但我如何知道非托管对象是未保留对象还是保留对象?例如,ABAddressBookCreateWithOptions:
框架中的方法AddressBook
返回一个非托管对象ABAddressBook
,一些教程将此视为保留对象。使用ALAsset
时,方法thumbnail
会返回一个非托管对象CGImage
,有些教程会将其视为未保留对象。
我感谢你的帮助。
答案 0 :(得分:6)
如何知道非托管对象是未保留对象还是保留对象?
这取决于您使用的API。
这里有一些约定:Ownership Polocy / Memory Management Programming Guide for Core Foundation
基本上,如果函数名称包含单词“Create”或“Copy”,请使用.takeRetainedValue()
。如果函数名称包含单词“Get”,请使用.takeUnretainedValue()
。
而且,如果它不包含,据我所知,我们几乎在所有情况下都可以使用.takeUnretainedValue()
。
但是,每个规则都有例外:)例如,请参阅:
Swift UnsafeMutablePointer<Unmanaged<CFString>?> allocation and print