根据将Swift与Cocoa和Objective- C结合使用takeUnretainedValue(),可以使用并takeRetainedValue()告诉Swift如何为这样的函数管理对象的内存:
takeUnretainedValue()
takeRetainedValue()
func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!
什么时候必须使用takeUnretainedValue()或takeRetainedValue()?
当我使用ARC时是否总是这样takeUnretainedValue()?
您可以使用takeRetainedValue在非托管对象有一个+1保留计数,你想ARC采取释放对象时,即可大功告成的照顾。例如,如果您用Create或Copy的名称调用Core Foundation函数(请参阅 《 Core Foundation内存管理编程指南 》中的Create Rule),该函数会返回您负责释放的非托管对象,因此通常使用它来释放它(或者,如果您不这样做,则必须使用或类似的功能自己手动释放它)。您可以使用当物的所有权并没有转移给你,你因此不想ARC释放对象,你当它下降的范围了。 __takeRetainedValue``CFRelease``takeUnretainedValue
takeRetainedValue
Create
Copy
takeRetainedValue``CFRelease``takeUnretainedValue
因此,关于何时调用takeUnretainedValuevs takeRetainedValue,仅取决于被调用函数返回的对象类型。根据一般经验,如果该对象是从Core Foundation函数返回的,其名称为Create或Copy名称,请使用takeRetainedValue。否则使用takeUnretainedValue。
takeUnretainedValue
就调用错误的方法会发生什么而言,如果takeUnretainedValue在传递+1对象(例如,从Core Foundation函数返回的对象中带有Create或Copy名称的对象)时调用,则除非您明确指定CFRelease,否则应用程序将泄漏。您可能不会立即注意到运行应用程序时偶尔发生的泄漏,但是可以通过观察应用程序的内存使用情况来观察到(例如,如果您使用Instruments来配置应用程序)。但是,如果您未解决这些泄漏问题,则您的应用最终可能会收到内存警告。
CFRelease
另一方面,如果调用takeRetainedValue未为您保留的对象(由没有Create或Copy以其名称命名的函数返回),则释放该对象时,应用程序可能会崩溃。有时,这种情况不会立即显现出来(直到最后一个强引用被解析之前),但通常会导致该应用程序发生灾难性的故障。
因此,明智地选择takeUnretainedValuevs takeRetainedValue非常重要。