Objective c ARC是否适用于核心图形对象?

Objective c ARC是否适用于核心图形对象?,objective-c,ios,core-animation,core-graphics,automatic-ref-counting,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是否仍能正常工作?您真的应该查看WWDC 2011中的ARC视频。它们可以在开发者网站上

我最近启动了一个使用自动引用计数(ARC)的新项目。
当我分配CALayer的内容时:

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage
我犯了个错误

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


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

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

•第323课时-引入自动参考计数

•第322课时-目标C深入推进

此外,ARC参考说明:

参考说明和视频都讨论了核心图形(等)以及它们如何与ARC一起工作

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

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

编译器不会自动管理内核的生命周期 基础对象;您必须调用CFRetain和CFRelease(或 相应的特定类型变体)由核心指定 基础内存管理规则(参见内存管理编程) 核心基础指南)

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

Jörg Jacobsen对桥接选项也有很好的概述:

\uuuuu bridge\u reserved(注意:仅在从对象指针转换为C类型指针时使用):我(程序员)需要引用此对象 在C类型指针的黑暗世界中有一段时间是不透明的 谢谢你,ARC。所以请,请不要在我还在的时候释放这个物体 我需要它。我(程序员)承诺自己(在黑暗中)发布它 世界)当我完成它

\uuuuuuu bridge\u transfer(注意:仅在从C类型指针转换为对象指针时使用):我(程序员)将ARC、an 我拥有的,在黑暗中不再感兴趣的物体 C类型指针的世界对您来说是不透明的。无论你什么时候,ARC 处理完那个物体,请自己释放它,因为你知道 正确的时间,从而节省了我一些不必自己做的工作

\uuu bridge:ARC,你不断平衡你的保留和释放,就像我在黑暗的C类型指针世界中不断平衡我的一样 是…。每当我需要抓住黑暗世界中的一个物体时,我都会 自己保留它,并在适当的时候释放它。我不需要 ARC,跟你有额外的合同


尽管Steve指出了这些参考资料,但我相信你上面展示的案例可能是特别的。在中,请注意“编译器处理Cocoa方法返回的CF对象”一节:

编译器理解返回核心的Objective-C方法 基金会类型遵循历史可可命名规则(见 高级内存管理编程指南)。例如 编译器知道,在iOS中,CGColor返回的CGColor UIColor的方法不为所有

它们提供的代码示例:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];
依赖于这些方法已知的CGColors返回(它们缺少我在上述代码中添加的转换为id,应该在它们的文档中尽快更正)


因为
[image CGImage]
遵循命名约定,我相信CGImage将在这里正确桥接。我认为你的id转换应该是你在这里所需要的一切。

layer.contents=(id)image.CGImage
问题的一个流行答案是
layer.contents=obj\u unretainedObject(image.CGImage)


我做
=(\uu桥id)image.CGImage

:)谢谢!很高兴我能帮忙!我们在几天前迁移了一个相当大的应用程序,花了大约两天的时间解决了所有的问题,但我对最终的结果非常满意。代码更少,更健壮。ARC很酷。这些视频对我来说是一个很棒的资源。我建议在你的答案中添加代码格式,以提高可读性。