首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ARC与核心图形对象一起工作吗?

ARC与核心图形对象一起工作吗?
EN

Stack Overflow用户
提问于 2011-10-18 06:08:40
回答 3查看 10K关注 0票数 17

我最近开始了一个使用自动引用计数(ARC)的新项目。

当我分配CALayer的内容时:

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

我收到一个错误

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

简单地将CGImageRef转换为id会隐藏错误,但我想知道ARC是否仍能正常工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-18 06:29:39

你真的应该看看来自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内存管理规则(请参阅Core Foundation的内存管理编程指南)调用CFRetain和CFRelease (或相应的特定于类型的变体)。

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

Jörg Jacobsen对桥接选项也有一个很好的概述:Managing Toll-free Bridging in an ARC’ed Environment

ARC __bridge_retained (注意:只有在从对象指针转换为C类型指针时才使用它):我(程序员)需要在C类型指针的黑暗世界中引用这个对象一段时间,这对你来说是不透明的,

。所以,请不要在我还需要的时候释放这个对象。我(程序员)承诺当我完成它的时候,我自己(在黑暗的世界)发布它。

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

__bridge:ARC,你一直在平衡你的保留和释放,就像我在…这个黑暗的C类型指针世界里平衡我的一样。每当我需要抓住黑暗世界中的一个物体时,我会自己保留它,并在适当的时候释放它。我不需要和你签任何额外的合同,

票数 43
EN

Stack Overflow用户

发布于 2011-10-21 03:05:51

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

编译器理解返回核心基础类型的Objective-C方法遵循历史上的Cocoa命名约定(参见高级内存管理编程指南)。例如,编译器知道,在iOS中,由UIColor的CGColor方法返回的CGColor不是所有的。

他们提供的代码示例:

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

依赖于这些方法返回的已知CGColors (它们缺少我在上面的代码中添加的对id的强制转换,应该很快就会在它们的文档中更正)。

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

票数 8
EN

Stack Overflow用户

发布于 2011-10-25 13:40:00

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

我做=(__bridge id)image.CGImage

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7800174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档