使用ARC返回自动释放的CFTypeRef

Ale*_*hol 9 core-graphics objective-c core-foundation ios automatic-ref-counting

我是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;
}
Run Code Online (Sandbox Code Playgroud)

所以,我想基本上创建一个方法,使用ARC,返回一个不属于调用者的CGImageRef.如果有更好的方法做同样的事情,我对所有想法都持开放态度.我知道UIImage这与CGImage财产有关.

编辑:虽然为特定文件禁用ARC是一种有效的方法,但我更喜欢在整个代码中使用纯ARC.这在与其他人共享特定文件的特定代码时非常方便,因为他们不需要更改任何给定文件的构建设置.为了利用ARC系统自动释放CFTypeRef,您可以这样做:

__attribute__((ns_returns_autoreleased))
id CGImageReturnAutoreleased (CGImageRef original) {
    // CGImageRetain(original);
    return (__bridge id)original;
}
Run Code Online (Sandbox Code Playgroud)

然后只需return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage)返回一个自动释放的图像.

rob*_*off 3

更新

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

原来的

您可以创建一个像这样的实用函数:

void cfAutorelease(CFTypeRef *ref) {
    [[(id)ref retain] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

并将其放入禁用 ARC 编译的文件中。您需要传递编译器标志-fno-objc-arc来禁用该文件的 ARC。在 Xcode 4 中,选择您的项目,然后选择“构建阶段”选项卡。打开编译源部分。双击包含实用函数的文件并将其放入-fno-objc-arc弹出框中。