当前位置: 首页 > 面试题库 >

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

司寇照
2023-03-14
问题内容

根据将Swift与Cocoa和Objective-
C结合
使用takeUnretainedValue(),可以使用并takeRetainedValue()告诉Swift如何为这样的函数管理对象的内存:

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

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

当我使用ARC时是否总是这样takeUnretainedValue()


问题答案:

您可以使用takeRetainedValue在非托管对象有一个+1保留计数,你想ARC采取释放对象时,即可大功告成的照顾。例如,如果您用CreateCopy的名称调用Core
Foundation函数(请参阅 《 Core Foundation内存管理编程指南

中的Create
Rule),该函数会返回您负责释放的非托管对象,因此通常使用它来释放它(或者,如果您不这样做,则必须使用或类似的功能自己手动释放它)。您可以使用当物的所有权并没有转移给你,你因此不想ARC释放对象,你当它下降的范围了。
__takeRetainedValue``CFRelease``takeUnretainedValue

因此,关于何时调用takeUnretainedValuevs
takeRetainedValue,仅取决于被调用函数返回的对象类型。根据一般经验,如果该对象是从Core
Foundation函数返回的,其名称为CreateCopy名称,请使用takeRetainedValue。否则使用takeUnretainedValue

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

另一方面,如果调用takeRetainedValue未为您保留的对象(由没有CreateCopy以其名称命名的函数返回),则释放该对象时,应用程序可能会崩溃。有时,这种情况不会立即显现出来(直到最后一个强引用被解析之前),但通常会导致该应用程序发生灾难性的故障。

因此,明智地选择takeUnretainedValuevs takeRetainedValue非常重要。



 类似资料:
  • 我有一个自己初始化的bean,我想让这个方法变成事务性的。 使用这种方法,可以在中工作,但是仍然不能工作,但是如果我使用spring托管bean,事务可以工作,回滚和数据库锁定都可以工作。

  • 是否可以在使用关键字创建的类中获取CDIBean的实例?我们目前正在对一个旧的应用程序进行一些增强,每次我们在应用程序中对CDI单例bean进行编程查找时,都会得到一个ContextNotActiveException。 获取参考的代码: BeanManager支持。JAVA

  • 问题内容: 有人可以解释何时以及何时不使用Swift中的委托指针进行“弱”分配,为什么? 我的理解是,如果您使用的协议未定义为类,则无法,也不想将您的委托指针分配给弱。 但是,当您的协议定义为类类型协议时,您是否要将委托设置为弱指针? 我对么?在Apple的快速指南中,类协议示例没有使用弱分配,但是在我的测试中,如果没有弱引用我的委托人,我会看到强参考周期。 问题答案: 通常,使类协议(如用关键字

  • 我似乎找不到在Swift中返回对象类型的函数或方法。 如何在Swift中检索对象的类型或类? 我尝试使用Obj-C类,但显然不起作用。 在python中,有或 在Javascript中有

  • 问题内容: 我对iOS开发和Swift相对较新。但是到目前为止,我一直可以通过一些关于stackoverflow的研究以及一些文档和教程来帮助自己。但是,有一个问题我找不到任何解决方案。 我想从用户通讯录中获取一些数据(例如single value属性)。因为如果此联系人在通讯录中没有firstName值,则该函数将引发错误,因此我需要确保该函数确实返回了一个值。我试图在封闭中检查此: 是类型的变

  • 问题内容: 当创建扩展助手来创建新的托管对象子类时,swift提供了一种可以模仿的类型,这很好,但是我似乎无法从中进行类型转换。以下代码无法编译,错误为 “ AnyObject”无法转换为“ Self” 救命? 问题答案: (现在为Swift 3/4更新。可以在编辑历史记录中找到早期Swift版本的解决方案。) 您可以使用到的返回值转换到 (这是该方法实际上是所谓的类型): 然后 工作,并且编译器