gpt4 book ai didi

objective-c - 使用 ARC 返回自动释放的 CFTypeRef

转载 作者:可可西里 更新时间:2023-11-01 02:59:08 25 4
gpt4 key购买 nike

我是 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。这在与其他人共享特定文件的特定代码时会派上用场,因为他们不需要更改任何给定文件的build设置。为了利用 ARC 系统自动释放 CFTypeRef,您可以这样做:

__attribute__((ns_returns_autoreleased))
id CGImageReturnAutoreleased (CGImageRef original) {
// CGImageRetain(original);
return (__bridge id)original;
}

然后只需执行 return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage) 即可返回自动释放的图像。

最佳答案

更新

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

原创

你可以像这样创建一个效用函数:

void cfAutorelease(CFTypeRef *ref) {
[[(id)ref retain] autorelease];
}

并将其放入您在禁用 ARC 的情况下编译的文件中。您需要传递编译器标志 -fno-objc-arc 以禁用该文件的 ARC。在 Xcode 4 中,选择您的项目,然后选择 Build Phases 选项卡。打开编译源部分。双击包含实用函数的文件,在弹出框中输入-fno-objc-arc

关于objective-c - 使用 ARC 返回自动释放的 CFTypeRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com