根据Using Swift with Cocoa and Objective-C,您可以使用takeUnretainedValue()takeRetainedValue()告诉Swift如何管理对象的内存,以实现以下功能:

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

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

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

推荐答案

如果非托管对象的保留计数为+1,并且希望ARC在完成后负责释放该对象,则使用takeRetainedValue.例如,如果调用一个名为CreateCopy的核心基础函数(参见Memory Management Programming Guide for Core Foundation中的Create Rule),它返回一个负责释放的非托管对象,则通常使用takeRetainedValue,以便它为您释放(或者,如果您不这样做,则必须手动地用CFRelease或类似的函数自己释放它).如果对象的所有权尚未转移给您,因此您不希望在对象超出范围时为您释放对象,则使用takeUnretainedValue.

所以,当你调用takeUnretainedValuetakeRetainedValue时,它只取决于被调用函数返回的对象的类型.作为一般经验法则,如果对象从核心基础函数中返回CreateCopy的名称,则使用takeRetainedValue.否则使用takeUnretainedValue.


如果你调用了错误的方法,如果你通过了一个+1对象(例如,从核心基础函数返回的对象有takeUnretainedValueCopy个名字),那么你的应用程序就会泄漏,除非你明确地将它CFRelease.运行应用程序时,您可能不会立即注意到偶尔出现的泄漏,但可以通过观察应用程序的内存使用情况(例如,如果您使用仪器评测应用程序)来观察泄漏情况.但如果你不解决这些漏洞,你的应用程序最终可能会收到内存警告.

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

所以明智地 Select takeUnretainedValuetakeRetainedValue是非常重要的.

Swift相关问答推荐

自定义完整屏幕封面动画

按变换zoom 在UIView中不起作用

从AppKit打开SwiftUI设置

如何使用Swift宏和@Observable和@Environment?

在Swift中如何将NSUrl转换为本地路径URL

协议元类型'SomeProtocol.Type'上无法使用静态成员'currency'

TabView 无法在屏幕上正确显示

如何延迟 swift 属性 didSet 使其每秒只触发一次

使用 WrappingHStack 文本溢出到新行

UIButton 配置不更新按钮标题

如何使用 Swinject 注册符合 ObservableObject 的协议?

SwiftUI Preview 不适用于 Core Data

如何在 ZStack 中单独下移卡片?

如何在填充上添加 if else 语句? SwiftUI

在视图中设置所有变量

Xcode 13.3 将函数调用更改为属性访问

UITableViewAlertForLayoutOutsideViewHierarchy 错误:仅警告一次(iOS 13 GM)

如何在 Swift 中判断变量的类型

快速延迟加载属性

如何判断 firebase 数据库值是否存在?