我最近开始了一个使用自动引用计数(ARC)的新项目。
当我分配 CALayer 的内容时:
UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage
我收到一个错误
ARC 不允许将非 Objective-C 指针类型“CGImageRef”隐式转换为“id”
只需铸造CGImageRef
to id
隐藏了错误,但我想知道 ARC 是否仍然可以正常工作?
您确实应该查看 WWDC 2011 的 ARC 视频。它们可以在开发者网站上找到并通过 iTunes 打开。尤其:
• 会议 323 – 介绍自动引用计数
• 会议 322 – Objective-C 的深入进展
另外,ARC 参考注释:
https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
参考笔记和视频都讨论了 Core Graphics(等)以及它们如何与 ARC 配合使用。
具体来说,请查看名为“管理免费桥接”
在许多 Cocoa 应用程序中,您需要使用 Core Foundation 风格的对象,无论是来自 Core Foundation 框架本身(例如
CFArrayRef 或 CFMutableDictionaryRef)或来自采用的框架
核心基础约定,例如核心图形(您可以使用类型
如 CGColorSpaceRef 和 CGGradientRef)。
编译器不会自动管理 Core 的生命周期
基础物体;您必须调用 CFRetain 和 CFRelease (或
相应的特定类型变体)由核心规定
基础内存管理规则(参见内存管理编程
核心基础指南)。
如果您在 Objective-C 和 Core Foundation 风格的对象之间进行转换,您
需要告诉编译器该对象的所有权语义
使用强制转换(在 objc/runtime.h 中定义)或 Core
基础风格宏(在 NSObject.h 中定义):[...]
Jörg Jacobsen 对桥接选项也有很好的总结概述:在 ARC 环境中管理免费桥接 http://www.joergjacobsen.com/blog/2011/10/05/managing-toll-free-bridging-in-an-arced-environment/.
__bridge_retained(注意:仅在从对象指针转换为 C 类型指针时使用它):我(程序员)需要引用该对象
在 C 类型指针的黑暗世界中有一段时间,这是不透明的
你,ARC。所以请不要在我还在的时候释放这个对象
需要它。我(程序员)保证自己发布(在黑暗中)
世界)当我完成它时
__bridge_transfer(注意:仅在从 C 类型指针转换为对象指针时使用它):我(程序员)将其交给你,ARC,一个
我拥有的、我在黑暗中不再感兴趣的物体
C 类型指针的世界对你来说是不透明的。每当你,ARC,
完成该对象后请自行释放它,因为您知道
正确的时间,从而节省我一些工作,而不必自己做。
__bridge:ARC,你一直在平衡你的保留和释放,就像我在 C 类型指针的黑暗世界中不断平衡我的一样。
是…。每当我需要在黑暗世界中抓住一个物体时,我就会
我自己保留它并在适当的时候释放它。我不需要任何
与你签订额外合同,ARC。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)