takeUnretainedValue
和takeRetainedValue
有什么区别?基于苹果的文档:
这两种方法都返回
对象。根据您的API
正在调用返回未包含或保留的对象。
但我如何知道非托管对象是非托管对象还是保留对象?例如,来自ABAddressBookCreateWithOptions:
framework的方法AddressBook
返回一个非托管对象,一些教程将其视为保留对象。当使用ABAddressBook
时,方法ALAsset
返回一个非托管对象,一些教程将其视为未包含的对象。
谢谢你的帮助。
最佳答案
如何知道非托管对象是非托管对象还是保留对象?
这取决于您使用的API。
这里有一些惯例:Ownership Polocy / Memory Management Programming Guide for Core Foundation
基本上,如果函数名包含单词“create”或“copy”,请使用.takeRetainedValue()
。如果函数名包含单词“get”,请使用.takeUnretainedValue()
。
而且,据我所知,如果它不包含任何一种,我们仍然可以在几乎所有情况下使用.takeUnretainedValue()
。
但是,每个规则都有一个例外:)例如,请参见:
Swift UnsafeMutablePointer<Unmanaged<CFString>?> allocation and print