You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用NSImage的CGImageForProposedRect返回的CGImage是否需要CGImageRelease释放?

结论

CGImageForProposedRect返回的CGImageRef必须主动调用CGImageRelease释放,你代码中的释放语句是必要的。

原因说明

Core Foundation 类型的内存管理严格遵循命名规则约定:

  • 如果方法名包含Create、Copy、Retain关键词,返回的对象由调用方持有,用完必须主动释放
  • 如果方法名不包含上述关键词,返回的对象调用方不持有,不需要主动释放

你调用的CGImageForProposedRect虽然属于NSImage的Objective-C方法,但其返回的Core Foundation类型对象遵循隐式持有规则:无论返回的是现有复用的CGImage还是新创建的CGImage,方法内部都已经对返回对象执行了一次retain操作,所有权转移给调用方,因此你必须在使用完成后执行CGImageRelease对应释放所有权:

  • 若返回的是复用的已有CGImage:你的释放操作仅抵消方法内部的retain计数,不会影响NSImage本身对该对象的持有
  • 若返回的是新创建的CGImage:你的释放操作会直接回收对应内存,避免泄漏
常见疑问解释

你测试时未加释放代码也没有崩溃,是因为如果返回的是系统缓存的复用CGImage,漏释放只会导致该对象引用计数多+1,这类缓存对象本身生命周期很长,短期运行不会触发崩溃,也很难直观看到内存变化,但长期频繁调用该方法时会出现持续内存泄漏。

正确代码示例
CGImageRef imageRef = [[NSImage imageNamed:resource] CGImageForProposedRect:&imageRect context:NULL hints:nil];
if (imageRef)
{
    // 业务逻辑处理
    // 必须执行释放
    CGImageRelease(imageRef);
}

内容的提问来源于stack exchange,提问作者Trygve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:39:00