- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将手动保留发布代码转换为 ARC。
当我有一个 Objective-C 便捷构造函数时,我正在努力找出免费桥接的正确方法,该构造函数的返回指针值存储在 CFTypeRef 中。
现有代码,使用 MRR:
@interface SourceItemCell UITableViewCell
{
CATextLayer *mSourceText;
}
@implementation SourceItemCell
- (id)init
{
self = [super init];
mSourceText = [CATextLayer layer];
// key line I'm wondering about:
mSourceText.font = [UIFont fontWithName:@"HelveticaNeue" size:12.0];
[[self contentView].layer addSublayer:mSourceText];
return self;
}
为了让您不必查找文档,CATextLayer 的字体属性是 CFTypeRef 类型。
看来我的选择是:
mSourceText.font = (__bridge CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
或:
mSourceText.font = (__bridge_transfer CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
或:
mSourceText.font = (__bridge_retained CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
这是我的想法。我发现的免费电话桥接最清晰的指南是 http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html .有一个类似的从 Objective-C 类型转换为 C 类型的例子,他写道:
By using __bridge_retained, we can tell ARC to transfer ownership out of the system and into our hands. Since ownership is transferred, we're now responsible for releasing the object when done with it, just like with any other CF code
...否则,如果我们只使用 __bridge,ARC 将不会努力保留我们 CFTypeRef 帐户上的内存。
所以这是我认为最明智的做法:
mSourceText.font = (__bridge_retained CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
... // At some later point
CFRelease(mSourceText.font);
现在,如果那是正确的,我仍然不清楚何时可以确定它是安全的,但如果我从未释放,那至少只是一个小的内存泄漏,对吧?
总而言之,我的实际问题是:
这就是为什么我认为相关问题没有回答我的问题:
附言。请不要评判我,因为我使用的是 Helvetica...:)
编辑:
当我使用 __bridge_retained 并进行静态分析时,我得到了这样的提示:
“属性返回一个保留计数为 +0 的 Core Foundation 对象。调用者此时不拥有的对象的引用计数减少不正确。”
(我认为 mDelegate 和 IS_ARC 行与此问题无关。)
所以有些事情我从根本上没有正确理解......
最佳答案
首先,我想知道原始MRR代码是否正确。根据文档,您不能将 UIFont
对象分配给 CATextLayer
的 font
属性,但可以将 CTFontRef
,或 CGFontRef
。像这样的东西应该可以正常工作:
CGFontRef font = CGFontCreateWithFontName(CFSTR("HelveticaNeue"));
mSourceText.font = font;
CGRelease(font);
mSourceText.fontSize = 12.0;
为了回答您关于桥接的问题,我们假设将 UIFont *
转换为 CGFontRef
是正确的(我很确定不是!)。然后你会使用__bridge
:
mSourceText.font = (__bridge CGFontRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
原因是 mSourceText
中的 CATextLayer
对象将保留字体本身,因此我们不需要这样做。
如果我们将 CGFontRef
存储在两者之间,我们必须小心。像这样的代码是危险的:
CGFontRef fontRef = (__bridge CGFontRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
mSourceText.font = fontRef;
ARC 可能会在第一条和第二条语句之间释放 UIFont
对象,这样 fontRef
指针就会指向一个释放的对象。如果我们想在两个语句中编写代码,我们必须保留对象,使其存活足够长的时间以便分配,然后再释放它:
CGFontRef fontRef = (__bridge_retained CGFontRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
mSourceText.font = fontRef;
CFRelease(fontRef);
关于objective-c - 我应该使用哪个 __bridge 免费桥接来将 Objective-C 便捷构造函数转换为 C ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614040/
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
正在学习有关 C 语言链接列表的教程。我已编译此代码并通过 valgrind 运行它。它显示了 4 次分配和 0 次释放,这是我理解的。我需要知道如何正确调用 free() 来释放分配。 代码示例:l
正如标题所说,我需要一个搜索引擎...用于mysql 搜索。我的网站是基于 PHP 的。 我打算使用 sphinx,但我的托管公司不支持全文索引! 所以一个没有全文的搜索引擎! 它应该是相当强大的,并
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我正在寻找稳定和成熟的免费/开源库来比较两个图像。 我找到了这个,但我想知道你是否使用更好的! Similar images finder - .NET Image processing in C#
我有一个通用链表实现,其中包含一个指向数据的 void* 的节点结构和一个包含对头的引用的列表结构。现在这是我的问题,链表中的一个节点可能通过其 void* 持有对另一个链表的引用。当我释放包含较小列
前言 在日常工作中PDF文档的处理往往受限于其固有的格式,使得用户在编辑、合并、剪裁等方面面临诸多不便。今天大姚给大家分享一个.NET开源、免费、功能强大的 PDF 处理工具:PDF 补丁丁(PDF
前言 最近发现DotNetGuide技术社区交流群有不少小伙伴在学习Avalonia,今天大姚给大家分享一款开源、免费、美观的 Avalonia UI 原生控件库:Semi Avalonia。
前言 今天大姚给大家分享一款开源(MIT License)、免费、现代化风格的WPF UI控件库:ModernWpf。 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化
LiveCharts2 LiveCharts2是一个.NET开源(MIT License)、简单、灵活、交互式且功能强大的.NET图表、地图和仪表,现在几乎可以在任何地方运行如:Maui、Uno P
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱。 工具箱介绍 胡桃工具箱是一款.NET开源(MIT
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
当我这样做时,我的 meteor 应用程序运行的免费服务器的规范是什么。 meteor deploy myapp.meteor.com 规范方面 Storage size Max bandwidth
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
如果可能,我可以使用任何网络服务免费存储少量数据(考虑 XML 或 JSON)? 我想我想创建一个小型待办事项应用程序,只是探索/学习(最好是免费的),它还可以将数据备份到云端,以便他们可以在智能手机
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Improve this qu
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!