【发布时间】:2011-12-12 22:44:10
【问题描述】:
我是使用 LLVM 和 Objective-C 进行自动引用计数的新手,并且有一个关于从我的 Objective-C 函数返回 CGImageRefs 的问题。在手动引用计数的日子里,可以简单地将 CGImageRef 转换为 id,自动释放它,然后返回原始 CGImageRef。使用 ARC,我知道您可以指示 ARC 系统自动释放并返回您的可保留对象,但我没有看到为 CFTypeRefs 执行此操作的方法。
这是禁用 ARC 后我可以做的事情:
- (CGImageRef)image {
CGImageRef myImage;
id myImageID = (id)myImage;
[myImageID autorelease];
return myImage;
}
所以,我想从本质上创建一个使用 ARC 的方法,该方法返回一个不属于调用者的 CGImageRef。如果有更好的方法来做同样的事情,我对想法持开放态度。我知道UIImage 使用CGImage 属性做了类似的事情。
编辑:虽然为特定文件禁用 ARC 是一种有效的方法,但我更喜欢在我的代码中使用纯 ARC。这在与其他人共享特定文件的特定代码时会派上用场,因为他们不需要更改任何给定文件的构建设置。为了利用 ARC 系统自动释放 CFTypeRef,您可以这样做:
__attribute__((ns_returns_autoreleased))
id CGImageReturnAutoreleased (CGImageRef original) {
// CGImageRetain(original);
return (__bridge id)original;
}
然后只需执行return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage) 即可返回自动发布的图像。
【问题讨论】:
-
我有一个非常相似的问题,但是当我实现该功能并尝试像您一样使用它时,Xcode 中的分析器说它正在泄漏。相反,我将方法的名称更改为以 new (- (CFTypeRef)newCFTypeObject) 开头,因此它遵循命名约定来返回一个保留对象。没有任何返回自动发布的 CFType 的漂亮方法吗? (没有各种辅助函数或外部文件)
-
我用的是你的代码,同样的,它有泄漏。
-
我建议不要偷懒,只需在正确的位置插入正确的 CFRelease 即可。它可以节省打字并使您的代码对其他人可读。当您可以从 NS 类型开始并使用免费桥接而不更改所有权时,您就可以了。否则你就是在污染水。
标签: objective-c ios core-graphics automatic-ref-counting core-foundation