【问题标题】:Returning an autorelease'd CFTypeRef with ARC使用 ARC 返回一个自动释放的 CFTypeRef
【发布时间】: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


【解决方案1】:

更新

从 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

【讨论】:

  • 你并没有真正用 ARC 做这件事——你没有做它。如果有更简单的方法会很好。
  • 呃,这真是一个 hack。它有效,但我不建议这样做。如果您真的需要自动释放它,请使用 __attribute__((ns_returns_autoreleased))。
【解决方案2】:

如果您使用的是ARC,请不要担心autoreleasing 对象,

UIImage *image;
image.CGImage

总是返回 autorelease 对象本身。

【讨论】:

  • 它可以使用 __bridge 进行免工具桥接
猜你喜欢
  • 2011-12-18
  • 2013-07-10
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
相关资源
最近更新 更多