ARC是否与Core Graphics对象一起工作?
我最近开始使用自动引用计数(ARC)的新项目。
当我分配CALayer的内容时:
UIView* view = ... UIImage* image = ... view.layer.contents = image.CGImage
我有一个错误
ARC不允许将非Objective-C指针types“CGImageRef”隐式转换为“id”
简单地把CGImageRef
成id
隐藏了这个错误,但是我想知道ARC是否仍然正常工作呢?
您应该确实查看WWDC 2011的ARCvideo。他们可以在开发者网站上find并通过iTunes打开。 特别:
•会话323 – 介绍自动引用计数
•第322节 – Objective-C深度进展
另外,ARC的参考资料:
参考笔记和video都讨论了Core Graphics(等)以及他们如何与ARC合作。
具体来说,看看“pipe理免费桥接”
在许多Cocoa应用程序中,无论是从Core Foundation框架本身(如CFArrayRef或CFMutableDictionaryRef)还是从采用Core Foundation约定(如Core Graphics)的框架(您可能使用类似CGColorSpaceRef和CGGradientRef )。
编译器不会自动pipe理Core Foundation对象的生命周期; 您必须按照Core Foundation内存pipe理规则的要求调用CFRetain和CFRelease(或相应的特定于types的变体)(请参阅内核pipe理编程指南(适用于Core Foundation))。
如果在Objective-C和Core Foundation样式对象之间进行投射,则需要使用强制转换(在objc / runtime.h中定义)或Core Foundation-样式的macros(在NSObject.h):[…]
JörgJacobsen对桥接选项也有很好的概述: pipe理ARC环境中的免费桥接 。
__bridge_retained (nb:从对象指针转换为Ctypes指针时只使用它):我(程序员)需要在黑暗的世界中引用这个对象一段时间,这对于你来说是不透明的。 所以,请不要在我还需要的时候释放这个对象。 我(程序员)承诺自己释放它(在黑暗的世界),当我完成它
__bridge_transfer (nb:从Ctypes指针转换为对象指针时才使用它):我(程序员)交给你,ARC,一个我自己拥有的对象,而且我不再对C型的黑暗世界感兴趣对你来说是不透明的指针。 每当你用这个对象完成这个对象,请自己释放它,因为你知道正确的时间,这样就省去了一些我自己不必做的工作。
__bridge :弧,你保持平衡你的保留和释放,因为我保持平衡我的黑暗世界的C型指针是…。 每当我需要在黑暗的世界中坚持一个物体时,我会自己保留它,并在适当的时候释放它。 ARC,我不需要任何额外的合同。
尽pipe史蒂夫指出了一些参考,但我相信你上面的例子可能是特别的。 从过渡到ARC发行说明 ,请注意“编译器处理cocoa方法返回的CF对象”一节:
编译器理解返回Core Foundationtypes的Objective-C方法遵循历史的Cocoa命名约定(参见高级内存pipe理编程指南)。 例如,编译器知道,在iOS中,由UIColor的CGColor方法返回的CGColor不是拥有的。
他们提供的代码示例:
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], (id)[[UIColor lightGrayColor] CGColor], nil];
依赖于这些方法已知的CGColors的返回(他们错过了我已经添加到上面的代码,这应该在他们的文档中很快纠正的ID到演员)。
因为[image CGImage]
遵循命名约定,所以我相信CGImage会在这里正确桥接。 我认为你的演员应该是你需要的一切。
一个stream行的答案layer.contents = (id)image.CGImage
问题是layer.contents = obj_unretainedObject(image.CGImage)
。
我做=(__bridge id)image.CGImage
。