桥接(Bridge)

桥接(Bridge)

  • 桥接(Bridge)
    • __bridge
    • __bridge_transfer
    • __bridge_retained

桥接(Bridge)

在开发 iOS 应用程序时我们有时会用到 Core Foundation 对象(简称 CF),例如 Core Graphics、Core Text。我们可能需要将 CF 对象和 OC 对象进行互相转化,因为在 ARC 环境下编译器不会自动管理 CF 对象的内存,所以当我们创建了一个 CF 对象以后就需要我们使用 CFRelease 将其手动释放,那么 CF 和 OC 相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge、__bridge_transfer、__bridge_retained,具体介绍和用法如下。

__bridge

在 CF 对象与 OC 对象相互转化时,此修饰只是对类型转化,不涉及对象的所有权转化。

例子:

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (CFURLRef)url;

上面的这段代码在 ARC 环境下系统会给出错误提示和错误修正,修正后如下:

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;

系统为我们自动添加了__bridge,因为创建的是一个 OC 对象,并且在转换时仅涉及到类型转换,没有涉及对象所有权的转换,所以内存管理依然是 OC 下的管理方式,上面的代码不需要加 CFRelease。

__bridge_transfer

将一个 CF 对象转化为一个 OC 对象时,将 CF 对象的所有权交给 OC 对象,此时 ARC 就能自动管理该内存,作用等同于 CFBridgingRelease()。

例子:

CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef)text,NULL,CFSTR("!*’();:@&=+$,/?%#[]"), 				                   CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
NSString *ocString = (__bridge_transfer CFStringRef)cfString;

__bridge_retained

作用与 __bridge_transfer 刚好相反。将一个 OC 对象转化为一个 CF 对象时,将 OC 对象的所有权交给 CF 对象管理,作用等同于 CFBridgingRetain()。

例子:

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 循环计算阶乘函数

应用场景: 1. 数学计算和问题求解,例如组合数学、概率统计等领域中,经常需要计算阶乘。 2. 算法设计中,某些算法可能需要用到阶乘来计算排列组合的数量或进行特定的数学运算。 3. 计算特定问题的解,如计算 n 个元素的全…

Redis这样优化后,又能“抗住”更大的并发了

插: AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈,越努力越幸运,大家…

在Ubuntu上安装VNC服务器教程

Ubuntu上安装VNC服务器方法:按照root安装TeactVnc,随后运行vncserver输入密码,安装并打开RickVNC客户端,输入服务器的IP,最后连接输入密码即可。 VNC或虚拟网络计算,可让您连接到远程Linux / Unix服务器的…

百数教学:如何用分析图表助力报表可视化?

表单收集的数据是决策的重要依据,而报表则是分析和处理这些数据的关键工具。 通过报表,我们能够进行明细查询,深入了解每一条数据的细节;通过汇总功能,用户能够快速掌握整体情况;计算平均值有助于用户评估…

为何Web前端开发仍坚守 HTML 和 CSS,而不全然拥抱纯 JavaScript?

在Web开发的世界里,HTML、CSS 和 JavaScript 三者构成了前端开发的基石。尽管 JavaScript 以其强大的功能和灵活性赢得了开发者们的青睐,甚至有人提出是否可以完全使用 JavaScript 来取代 HTML 和 CSS,实现“纯 JavaScript 开发”。然而&…

《nginx应用》-- nginx简单部署vue项目

一、vue项目的打包 vue项目在本地调试完成后,即可执行以下命令打包部署,此时会生成一个 dist 包,这个包即是我们要部署的文件。 npm run build 二、nginx 的安装 nginx 的安装比较简单,直接用 yum 安装即可 yum install nginx…

SCT612404通道,高效高集成,摄像头模组电源集成芯片

集成三路降压变换器,1CH高压BUCK,2CH低压Buck >HVBuck1:输入电压4.0V-20V,输出电流1.2A,Voo300mV/500mV >LVBuck2:输入电压2.7V-5V,输出电流0.6A , 固定1.8V输出 ;LVBuck3:输λ2.7V-5V,输出电流1.2A,可设定固定输出: 1 . 1 V / 1 . 2 V / 1 . 3 …

for nested data item, row-key is required.报错解决

今天差点被一个不起眼的bug搞到吐,就是在给表格设置row-key的时候,一直设置不成功,一直报错缺少row-key,一共就那两行代码 实在是找不到还存在什么问题... 先看下报错截图... 看下代码 我在展开行里面用到了一个表格 并且存放表格…

公共事件应急日常管理系统-计算机毕业设计源码40054

公共事件应急日常管理系统的设计与实现 摘 要 本研究基于Spring Boot框架,设计并实现了公共事件应急日常管理系统,旨在提升公共事件的应急响应和日常管理效率。系统包括应急资源管理、物资申请管理、物资发放管理、应急培训管理、科普宣教管理、公共事件…

html5中的iframe

HTML5中的iframe 浏览上下文是浏览器展示文档的环境,通常是一个tab标签页,一个窗体或者是浏览器页面的一部分。每个浏览上下文都有一个活动文档的源和一个记录所有展示文档的有序历史。浏览上下文的通讯被严格限制,只有两个同源的浏览器上下…

浔川为何做起音乐、电影报?——浔川官方回应

官方回应 满足群众对音乐和电影文化的需求:为读者提供音乐和电影方面的资讯、评论、介绍等,丰富人们的文化生活。 推动当地音乐和电影产业的发展:通过报道本地的音乐、电影活动等,为提供宣传和推广的平台,促进其繁荣。…

数据中心代理IP与普通代理IP有何区别?

数据中心代理IP与普通代理IP在使用方式和性质上存在一些区别。以下是两者之间的主要区别: 1.来源不同:数据中心代理IP是由数据中心提供的,这些数据中心通常专门提供IP代理服务,并且拥有大量的服务器和IP地址。而普通代理IP则来自…

Redis 多数据源 Spring Boot 实现

1.前言 本文为大家提供一个 redis 配置多数据源的实现方案,在实际项目中遇到,分享给大家。后续如果有时间会写一个升级版本,升级方向在第5点。 2.git 示例地址 git 仓库地址:https://github.com/huajiexiewenfeng/redis-multi-…

剖析DeFi交易产品之UniswapV3:Pool合约

本文首发于公众号:Keegan小钢 UniswapV3Pool 合约则复杂很多了,其引用的库合约就达到了 13 个,通过 using 方式使用的也达到了 9 个,如下所示: using LowGasSafeMath for uint256; using LowGasSafeMath for int256; …

数据治理新时代:筛斗数据如何推动企业数据价值的释放

【标题】数据治理新时代:筛斗数据如何引领企业数据价值的深度释放 在当今这个信息爆炸的时代,数据已成为企业最宝贵的资产之一,其潜在价值远超传统资源。然而,海量数据的涌现也带来了前所未有的挑战:如何高效、准确地…

【解码现代 C++】:实现自己的智能 【String 类】

目录 1. 经典的String类问题 1.1 构造函数 小李的理解 1.2 析构函数 小李的理解 1.3 测试函数 小李的理解 1.4 需要记住的知识点 2. 浅拷贝 2.1 什么是浅拷贝 小李的理解 2.2 需要记住的知识点 3. 深拷贝 3.1 传统版写法的String类 3.1.1 拷贝构造函数 小李的理…

共享门店模式:实体门店合伙制的解决方案

在当今这个快速迭代的商业时代,共享门店模式以其独到的商业智慧和灵活的运营策略,正逐步成为推动行业变革的重要力量。它巧妙地融合了共享经济的前沿理念与线下门店的实体优势,开辟了一条资源高效整合与价值深度挖掘的新路径。 共享门店模式…

量化交易对长期投资的影响

量化交易,通过其基于算法的决策过程,已成为现代金融市场的一个重要组成部分。对于长期投资,量化交易的影响是复杂且多维的,涉及市场效率、投资策略的优化以及风险管理等多个方面。 首先,量化交易通过提高交易速度和执…

大数据面试题之Presto[Trino](2)

描述Presto中的Connector是什么? 在Presto中,Connector是连接Presto查询引擎与外部数据存储系统的桥梁。它是一个插件化的组件,允许Presto与多种不同的数据源无缝集成,从而实现跨数据源的SQL查询。以下是Connector的一些关键特性…

MySQL学习(8):约束

1.什么是约束 约束是作用于表中字段上的规则,以限制表中数据,保证数据的正确性、有效性、完整性 约束分为以下几种: not null非空约束限制该字段的数据不能为nullunique唯一约束保证该字段的所有数据都是唯一、不重复的primary key主键约束…