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

Pie*_*ter 17 core-animation core-graphics objective-c ios automatic-ref-counting

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

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误

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

简单地铸造CGImageRefid隐藏的错误,但我想知道如果ARC仍然正常工作呢?

Ste*_*eve 43

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

•会话323 - 自动引用计数简介

•会议322 - 深度的Objective-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 Foundation约定的框架(如Core Graphics)(您可以使用类似CGColorSpaceRef和CGGradientRef的类型) ).

编译器不会自动管理Core Foundation对象的生命周期; 您必须根据Core Foundation内存管理规则调用CFRetain和CFRelease(或相应的特定于类型的变体)(请参阅Core Foundation内存管理编程指南).

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

JörgJacobsen对桥接选项进行了很好的总结概述:在ARC环境中管理免费电话桥接.

__bridge_retained(nb:仅在从对象指针转换为C类型指针时使用它):I(程序员)需要在C类型指针的黑暗世界中引用此对象一段时间,这对您来说是不透明的,ARC.所以,请不要在我需要的时候释放这个对象.我(程序员)承诺在我完成它的时候自己发布它(在黑暗的世界中)

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

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


Bra*_*son 8

尽管史蒂夫指出了参考文献,但我相信你上面展示的案例可能很特别.从转换到ARC发行说明,请注意"编译器处理从Cocoa方法返回的CF对象"部分:

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

他们提供的代码示例:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];
Run Code Online (Sandbox Code Playgroud)

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

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