我是使用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)
即可返回自动释放的图片。
答案 0 :(得分:3)
从OS X 10.9和iOS 7.0开始,公共SDK包含CFAutorelease
函数。
您可以创建这样的实用程序函数:
void cfAutorelease(CFTypeRef *ref) {
[[(id)ref retain] autorelease];
}
并将其放在您禁用ARC编译的文件中。您需要传递编译器标志-fno-objc-arc
以禁用该文件的ARC。在Xcode 4中,选择您的项目,然后选择Build Phases选项卡。打开“编译源”部分。双击包含效用函数的文件,并将-fno-objc-arc
放在弹出框中。
答案 1 :(得分:-1)
如果您使用ARC
,请不要担心autoreleasing
对象,
UIImage *image;
image.CGImage
始终返回autorelease
对象本身。