何时使用takeUnretainedValue()或takeRetainedValue()来检索Swift中的非托pipe对象?
根据在Cocoa和Objective-C中使用Swift,可以使用takeUnretainedValue()
和takeRetainedValue()
来告诉Swift如何pipe理一个对象的内存,如下所示:
func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!
何时必须使用takeUnretainedValue()
或takeRetainedValue()
?
当我使用ARC时,它总是takeUnretainedValue()
?
当非托pipe对象具有+1保留计数时,您可以使用takeRetainedValue
,并且在完成后您希望ARC负责释放对象。 例如,如果您在名称中使用“ Create
或“ Copy
来调用Core Foundation函数(请参阅Core Management的“内存pipe理编程指南 ”中的“ 创build规则 ” ),该函数返回您负责释放的非托pipe对象,通常使用takeRetainedValue
它是为你发布的(或者,如果你不这样做,你必须用CFRelease
或类似的函数手动释放它)。 如果对象的所有权尚未转移给您,则使用takeUnretainedValue
,因此您不希望ARC在超出范围时为您释放对象。
所以,至于何时调用takeUnretainedValue
vs takeRetainedValue
,它只是取决于被调用函数返回的对象types。 作为一般的经验法则,如果对象是从名称中带有Create
或Copy
的Core Foundation函数返回的,则使用takeRetainedValue
。 否则使用takeUnretainedValue
。
就如果调用错误方法会发生什么情况而言,如果在传递+1对象(例如,从Core Foundation函数返回的名称中带有Create
或Copy
的对象)时调用takeUnretainedValue
,则除非明确指定,否则应用程序将会泄漏CFRelease
它。 运行应用程序时,您可能不会立即注意到偶尔泄漏的情况,但可以通过观察应用程序的内存使用情况(例如,如果使用仪器来分析应用程序)来观察。 但是,如果你没有解决这些漏洞,你的应用程序最终可能会收到内存警告。
另一方面,如果你调用了一个没有被你保留的对象上的takeRetainedValue
(由名字中没有Create
或Copy
的函数返回),那么当对象被释放时,应用程序可能会崩溃。 有时这不会立即显现(直到最后一个强烈的参考被解决),但是通常会导致应用程序的灾难性失败。
所以明智的selecttakeUnretainedValue
vs takeRetainedValue
是非常重要的。