3

takeUnretainedValue和有什么区别takeRetainedValue?根据 Apple 的文档:

这两种方法都返回对象的原始未包装类型。您可以根据所调用的 API 返回未保留对象还是保留对象来选择要使用的方法。

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

我会感谢你的帮助。

4

1 回答 1

8

我如何知道非托管对象是未保留对象还是保留对象?

这取决于您使用的 API。

这里有一些约定:Core Foundation 的所有权策略/内存管理编程指南

基本上,如果函数名称包含单词“创建”或“复制”,请使用.takeRetainedValue(). 如果函数名称包含单词“Get”,请使用.takeUnretainedValue().

而且,如果它不包含任何一个,据我所知,我们仍然可以.takeUnretainedValue()在几乎所有情况下使用。

但是,每个规则都有一个例外 :) 例如,请参阅:
Swift UnsafeMutablePointer<Unmanaged<CFString>?> allocation and print

于 2015-03-11T05:34:16.347 回答