使用ARC返回自动释放的CFTypeRef

时间:2011-10-21 22:28:19

标签: objective-c ios core-graphics automatic-ref-counting core-foundation

我是使用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)即可返回自动释放的图片。

2 个答案:

答案 0 :(得分:3)

更新

从OS X 10.9和iOS 7.0开始,公共SDK包含CFAutorelease函数。

ORIGINAL

您可以创建这样的实用程序函数:

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对象本身。