调用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
相关产品推荐
相关产品推荐

