ios – 何时使用takeUnretainedValue()或takeRetainedValue()来检索Swift中的非托管对象?

根据Using Swift with Cocoa and Objective-C你可以使用takeUnretainedValue()和takeRetainedValue()来告诉Swift如何管理一个对象的内存,如下所示:

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

何时需要使用takeUnretainedValue()或takeRetainedValue()?

当我使用ARC时,它总是会被取消Value()?

当非托管对象具有1个保留计数时,您可以使用takeRetainedValue,并且在完成后,您希望ARC保留释放该对象。例如,如果您使用Create(创建)或Copy(复制)名称中的Core Foundation函数(参见Core Foundation的“内存管理编程指南”中的Create Rule),该函数返回您负责释放的非托管对象,则通常使用takeRetainedValue,以便它被释放给你(或者如果你不这样做,你必须用CFRelease或类似功能手动释放它)。当对象的所有权尚未转移到您时,您使用takeUnretainedValue,因此,当ARC超出范围时,您不希望ARC为您释放对象。

所以,当你调用takeUnretainedValue vs takeRetainedValue时,它只是取决于被调用函数返回什么样的对象。作为一般的经验法则,如果使用名称中的Create或Copy从Core Foundation函数返回对象,请使用takeRetainedValue。否则使用takeUnretainedValue。

如果您调用错误的方法发生什么,如果您在传递1个对象(例如,从Core Foundation函数返回的对象(名称中为Create或Copy)时调用takeUnretainedValue),则您的应用程序将泄漏,除非您明确地CFRelease它。您可能不会立即注意到运行应用程序时偶尔发生泄漏,但可以通过观察应用程序的内存使用情况(例如,如果您使用乐器配置应用程序)来观察。但是,如果您将这些漏洞留给未解决,您的应用程序最终可能会收到内存警告。

另一方面,如果在没有为您保留的对象(由其名称中没有创建或复制的函数返回)中调用takeRetainedValue,则该对象在释放时可能会崩溃。有时,这不会立即显现(直到最后一个强参考解决),但通常会导致应用程序的灾难性故障。

如此明智的选择takeUnretainedValue vs takeRetainedValue是非常重要的。

翻译自:https://stackoverflow.com/questions/29048826/when-to-use-takeunretainedvalue-or-takeretainedvalue-to-retrieve-unmanaged-o

转载注明原文:ios – 何时使用takeUnretainedValue()或takeRetainedValue()来检索Swift中的非托管对象?