gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:04:05 26 4
gpt4 key购买 nike

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

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

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

当我使用 ARC 时,它是否总是 takeUnretainedValue()

最佳答案

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

所以,至于你什么时候调用takeUnretainedValue对比takeRetainedValue ,它仅取决于被调用函数返回的对象类型。作为一般经验法则,如果对象是从带有 Create 的 Core Foundation 函数返回的或 Copy在名称中,使用 takeRetainedValue .否则使用 takeUnretainedValue .


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

另一方面,如果您调用 takeRetainedValue在尚未为您保留的对象上(由名称中没有 CreateCopy 的函数返回),当对象被释放时,应用程序可能会崩溃。有时这不会立即显现出来(直到最后一个强引用被解析),但它通常会导致应用程序出现灾难性故障。

如此明智地选择 takeUnretainedValue对比takeRetainedValue非常重要。

关于ios - 何时使用 takeUnretainedValue() 或 takeRetainedValue() 在 Swift 中检索非托管对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com