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)返回一个自动释放的图像.
从 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弹出框中。
| 归档时间: |
|
| 查看次数: |
3268 次 |
| 最近记录: |