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

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

我有一个错误

非目标转换为非目标-C指针类型“ cgimageref”到“ id”是不允许的

简单地施放 CGImageRefid 隐藏了错误,但是我想知道弧线是否仍然正确起作用?

有帮助吗?

解决方案

您应该真正查看WWDC 2011的ARC视频。它们可在开发人员网站上找到,并通过iTunes开放。尤其:

•会议323 - 引入自动参考计数

•会议322 - Objective-C深入进步

另外,弧参考注释:

https://developer.apple.com/library/content/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

参考注释和视频都讨论了核心图形(等)以及它们如何与ARC一起使用。

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

在许多可可应用中,您都需要使用核心基础风格的对象,无论是从核心基础框架本身(例如Cfarrayref或cfmutabledictionicnictionaryref)还是从采用核心基础公约(例如CGCOLORSPACEREF和CGGRADIENTERF和CGGRADIENTREF)等类型的框架中使用的框架( )。

编译器不会自动管理核心基础对象的寿命;您必须拨打CFRETAIN和CFREALE(或由核心基础内存管理规则(请参阅核心基础的内存管理编程指南)所规定的相应类型特定变体)。

如果您在Objective-C和Core Foundation式式对象之间进行铸造,则需要使用铸件(在OBJC/Runtime.h)或核心基础风格的宏(定义在IN中定义)来告诉编译器对象的所有权语义nsobject.h):[...

JörgJacobsen也有很好的概述介绍了桥接选项: 在电弧环境中管理免费桥接.

__bridge_retained (NB:仅在从对象指针到C类型指针的对象指针施放时使用它):I(程序员)需要在C型指针的黑暗世界中引用此对象一段时间,这对您来说是不透明的,ARC。因此,请在我仍然需要的时候不要释放此对象。我(程序员)承诺在完成时(在黑暗世界中)自己释放它

__bridge_transfer (NB:仅在从C类型指针到对象指针的C铸造时使用它):I(程序员)将我拥有的对象交给您,我不再对C类型Pointers的黑暗世界感兴趣那对你来说是不透明的。每当您使用该对象完成ARC时,请自己释放它,因为您知道合适的时间,因此为我节省了一些工作,而不必自己做。

__桥: :ARC,当我在C型指针的黑暗世界中不断平衡我时,您一直在平衡自己的保留和释放。每当我需要抓住黑暗世界中的物体时,我都会保留它并在适当时释放它。我不需要与您任何额外的合同,Arc。

其他提示

尽管史蒂夫(Steve)指出了一些参考文献,但我相信您上面展示的案件可能很特别。来自 过渡到电弧发行说明, ,请注意“编译器处理可可方法返回的CF对象”部分:

编译器了解返回核心基础类型的Objective-C方法遵循历史可可命名约定(请参阅高级内存管理编程指南)。例如,编译器知道,在iOS中,由Uicolor的CGColor方法返回的CGCOLOR不拥有。

他们提供的代码示例:

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

依赖于这些方法的CGCOLORS的已知返回(它们错过了我在上述代码中添加的ID的铸件,应在其文档中纠正其文档)。

因为 [image CGImage] 遵循命名惯例,我相信CGIMAGE将在这里正确桥接。我认为您的演员身份证应该是您在这里需要的全部。

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

我愿意 =(__bridge id)image.CGImage.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top