ARC是否可以使用Core Graphics对象?

时间:2011-10-17 22:08:40

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

我最近使用自动参考计数(ARC)开始了一个新项目 当我分配CALayer的内容时:

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage

我收到了错误

  

ARC不允许将非Objective-C指针类型'CGImageRef'隐式转换为'id'

只需将CGImageRef转换为id隐藏错误,但我想知道ARC是否仍能正常运行?

3 个答案:

答案 0 :(得分:43)

您应该从WWDC 2011中查看ARC视频。它们可以在开发者网站上找到并通过iTunes打开。特别是:

  

•会话323 - 自动参考计数简介

     

•会议322--深度目标C进展

另外,ARC参考文献指出:

  

https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

参考笔记和视频都讨论了Core Graphics(等)以及它们如何与ARC协同工作。

具体来说,请看一下名为“管理免费电话桥接”的部分

  

在许多Cocoa应用程序中,您需要使用Core Foundation样式的对象,无论是来自Core Foundation框架本身(例如   CFArrayRef或CFMutableDictionaryRef)或采用的框架   核心基础约定,例如Core Graphics(您可以使用类型   比如CGColorSpaceRef和CGGradientRef)。

     

编译器不会自动管理Core的生命周期   基础对象;你必须打电话给CFRetain和CFRelease(或者   相应的类型特定的变体)由核心指示   基础内存管理规则(请参阅内存管理编程   核心基金会指南)。

     

如果您在Objective-C和Core Foundation风格的对象之间进行投射,那么   需要告诉编译器有关对象的所有权语义   使用强制转换(在objc / runtime.h中定义)或核心   基础风格的宏(在NSObject.h中定义):[...]

JörgJacobsen对桥接选项有一个很好的总结概述:Managing Toll-free Bridging in an ARC’ed Environment

  

__ bridge_retained (n.b。:从对象指针转换为C类型指针时只使用它):我(程序员)需要引用此对象   在C型指针的黑暗世界中有一段时间是不透明的   你,ARC。所以,请不要在我静止的时候释放这个物体   需要它。我(程序员)承诺自己发布它(在黑暗中   世界)当我完成它时

     

__ bridge_transfer (n.b。:从C类型指针转换为对象指针时只使用它):我(程序员)交给你,ARC,一个   我拥有的对象,我不再对黑暗感兴趣   对你来说不透明的C型指针世界。每当你,ARC,都是   完成该对象请自行释放,因为你知道   正确的时间,从而节省了一些不必自己做的工作。

     

__ bridge :ARC,你不断平衡你的保留和释放,因为我在C型指针的黑暗世界中保持平衡   是...。每当我需要在黑暗的世界中抓住一个物体时,我会   自己保留并在适当的时候释放它。我不需要任何   与你签订额外合同,ARC。

答案 1 :(得分:8)

尽管史蒂夫指出了参考文献,但我相信你上面展示的案例可能很特别。从Transitioning to ARC Release Notes开始,请注意“编译器处理从Cocoa方法返回的CF对象”部分:

  

编译器理解返回Core的Objective-C方法   基础类型遵循历史Cocoa命名约定(请参阅   高级内存管理编程指南)。例如,   编译器知道,在iOS中,CGColor返回CGColor   UIColor的方法不属于。

他们提供的代码示例:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

依赖于从这些方法中已知的CGColors返回(它们缺少我在上面的代码中添加的转换为id,这应该很快在他们的文档中得到纠正)。

因为[image CGImage]遵循命名约定,我相信CGImage将在这里正确桥接。我认为你的演员应该是你需要的所有内容。

答案 2 :(得分:4)

layer.contents = (id)image.CGImage问题的一个常见答案是layer.contents = obj_unretainedObject(image.CGImage)

我做=(__bridge id)image.CGImage