【发布时间】:2009-12-22 23:02:57
【问题描述】:
我在垃圾收集环境中使用 Core Foundation 方法。根据documentation 调用 CFRelease 只是减少引用计数但不释放对象:
垃圾收集环境和引用计数环境的区别在于对象释放的时间。在引用计数环境中,当对象的保留计数降至 0 时,它会立即释放;在垃圾收集环境中,当 Core Foundation 对象的保留计数从 1 变为 0 时会发生什么取决于它在内存中的位置:
- 如果对象在 malloc 区域中,则立即解除分配。
- 如果对象在垃圾回收区,最后一个 CFRelease() 不会立即释放该对象,它只是使其有资格在发现无法访问时被回收器回收——也就是说,一旦所有对它的强引用都消失了。因此,只要该对象仍被对象类型的实例变量(尚未标记为__weak)、寄存器、堆栈或全局变量引用,就不会被收集。
有时我会打开持有成本高昂的资源,例如网络上的文件:
CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL);
是否可以在不等待垃圾收集器的情况下确定性地释放 imageSource 对象(关闭、处置、销毁、杀死混蛋)?
.Net Framework 有 IDisposable 接口,我可以这样做:
using (Font myFont = new Font("Arial", 10.0f))
{
// use myFont
} // compiler will call Dispose on myFont
Objective-C/Cocoa 中有类似的东西吗?
【问题讨论】:
标签: cocoa garbage-collection core-foundation