一尘不染

何时使用takeUnretainedValue()或takeRetainedValue()在Swift中检索非托管对象?

swift

根据将Swift与Cocoa和Objective-
C结合
使用takeUnretainedValue(),可以使用并takeRetainedValue()告诉Swift如何为这样的函数管理对象的内存:

func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

什么时候必须使用takeUnretainedValue()takeRetainedValue()

当我使用ARC时是否总是这样takeUnretainedValue()


阅读 381

收藏
2020-07-07

共1个答案

一尘不染

您可以使用takeRetainedValue在非托管对象有一个+1保留计数,你想ARC采取释放对象时,即可大功告成的照顾。例如,如果您用CreateCopy的名称调用Core
Foundation函数(请参阅 《 Core Foundation内存管理编程指南
中的Create
Rule)
,该函数会返回您负责释放的非托管对象,因此通常使用它来释放它(或者,如果您不这样做,则必须使用或类似的功能自己手动释放它)。您可以使用当物的所有权并没有转移给你,你因此不想ARC释放对象,你当它下降的范围了。
__takeRetainedValue``CFRelease``takeUnretainedValue

因此,关于何时调用takeUnretainedValuevs
takeRetainedValue,仅取决于被调用函数返回的对象类型。根据一般经验,如果该对象是从Core
Foundation函数返回的,其名称为CreateCopy名称,请使用takeRetainedValue。否则使用takeUnretainedValue


就调用错误的方法会发生什么而言,如果takeUnretainedValue在传递+1对象(例如,从Core
Foundation函数返回的对象中带有CreateCopy名称的对象)时调用,则除非您明确指定CFRelease,否则应用程序将泄漏。您可能不会立即注意到运行应用程序时偶尔发生的泄漏,但是可以通过观察应用程序的内存使用情况来观察到(例如,如果您使用Instruments来配置应用程序)。但是,如果您未解决这些泄漏问题,则您的应用最终可能会收到内存警告。

另一方面,如果调用takeRetainedValue未为您保留的对象(由没有CreateCopy以其名称命名的函数返回),则释放该对象时,应用程序可能会崩溃。有时,这种情况不会立即显现出来(直到最后一个强引用被解析之前),但通常会导致该应用程序发生灾难性的故障。

因此,明智地选择takeUnretainedValuevs takeRetainedValue非常重要。

2020-07-07