takeUnretainedValue和takeRetainedValue之间的区别是什么?

时间:2015-03-11 03:43:21

标签: swift memory-management unsafe-unretained retained-in-memory

takeUnretainedValuetakeRetainedValue之间的区别是什么?基于Apple的文档:

  

这两种方法都返回原始的,未包装的类型   宾语。您可以根据API是否选择使用哪种方法   正在调用返回一个未保留或保留的对象。

但我如何知道非托管对象是未保留对象还是保留对象?例如,ABAddressBookCreateWithOptions:框架中的方法AddressBook返回一个非托管对象ABAddressBook,一些教程将此视为保留对象。使用ALAsset时,方法thumbnail会返回一个非托管对象CGImage,有些教程会将其视为未保留对象。

我感谢你的帮助。

1 个答案:

答案 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