如果非托管对象的保留计数为+1,并且希望ARC在完成后负责释放该对象,则使用takeRetainedValue
.例如,如果调用一个名为Create
或Copy
的核心基础函数(参见Memory Management Programming Guide for Core Foundation中的Create Rule),它返回一个负责释放的非托管对象,则通常使用takeRetainedValue
,以便它为您释放(或者,如果您不这样做,则必须手动地用CFRelease
或类似的函数自己释放它).如果对象的所有权尚未转移给您,因此您不希望在对象超出范围时为您释放对象,则使用takeUnretainedValue
.
所以,当你调用takeUnretainedValue
对takeRetainedValue
时,它只取决于被调用函数返回的对象的类型.作为一般经验法则,如果对象从核心基础函数中返回Create
或Copy
的名称,则使用takeRetainedValue
.否则使用takeUnretainedValue
.
如果你调用了错误的方法,如果你通过了一个+1对象(例如,从核心基础函数返回的对象有takeUnretainedValue
或Copy
个名字),那么你的应用程序就会泄漏,除非你明确地将它CFRelease
.运行应用程序时,您可能不会立即注意到偶尔出现的泄漏,但可以通过观察应用程序的内存使用情况(例如,如果您使用仪器评测应用程序)来观察泄漏情况.但如果你不解决这些漏洞,你的应用程序最终可能会收到内存警告.
另一方面,如果你对一个没有为你保留的对象(由一个名称中没有Create
或Copy
的函数返回)调用takeRetainedValue
,当该对象被释放时,应用程序可能会崩溃.有时这不会立即表现出来(直到最后一个强引用被解决),但它通常会导致应用程序的灾难性故障.
所以明智地 Select takeUnretainedValue
对takeRetainedValue
是非常重要的.