__bride、__bride_transfer和__bride_retain的区别和用法

153 篇文章 0 订阅
订阅专栏
61 篇文章 0 订阅
订阅专栏

在上一篇里讲到内存泄漏的检测,有一处内存泄露是由于CoreFoundation创建的对象没有释放掉,在开发中Foundation和CoreFoundation框架里的对象需要转换才能用。

一、ARC和Foundation、CoreFoundation

和它一样的还有__bride_transfer和__bride_retain,那么他们之间有什么关系和区别呢?在讲这个之前我们先看一下ARC和Foundation、CoreFoundation框架之间的关系:

二、__bride、__bride_transfer和__bride_retain的区别和作用

所以,在非ARC下两者互转都是需要手动管理内存的,我们重点关注的是在ARC下转换注意的地方。那么下面就是在ARC下,__bride、__bride_transfer和__bride_retain的区别和作用:

三、用法实例

接上一篇的一个内存泄露的例子,下面代码中C语言创建的两个对象没有释放:

+ (NSString *)createUUID
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStrRef = CFUUIDCreateString(NULL, uuidRef);
    NSString *uuidStr = [NSString stringWithFormat:@"%@",uuidStrRef];   
    return uuidStr;
}

在上一篇中我们给出的解决办法,也是最直观的办法是手动释放对象的内存:

+ (NSString *)createUUID
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStrRef = CFUUIDCreateString(NULL, uuidRef);
    NSString *uuidStr = [NSString stringWithFormat:@"%@",uuidStrRef];

    CFRelease(uuidRef);
    CFRelease(uuidStrRef);
    
    return uuidStr;
}

其实在上面提到的__bride_transfer和__bride_retain也可以解决类似的内存管理的问题,比如下面这种改法:

+ (NSString *)createUUID
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStrRef = CFUUIDCreateString(NULL, uuidRef);
    
    NSString *uuidStr = (__bridge_transfer NSString *)uuidStrRef;

    return uuidStr;
}

__bridge_transfer用在将CoreFoundation对象转换成Foundation对象,用于进行内存管理权移交,手动变自动,所以创建的对象交给了ARC去管理,就不用手动释放了。

四、三种示例
/* ARC管理的Foundation对象 */
        NSString *s1 = @"string";
        //转换后依然由ARC管理释放
        CFStringRef cfstring = (__bridge CFStringRef)s1;
        //开发者手动管理的CoreFoundation对象,需要手动释放
        CFStringRef s2 = CFStringCreateWithCString(NULL, "string", kCFStringEncodingASCII);
        //转换后依然需要开发者手动管理释放
        NSString *fstring = (__bridge NSString*)s2;
        //手动释放CFRelease(s2);
        
        
 /* 转换后改由ARC管理对象的释放,不用担心内存泄露 */
        NSString *fstring1 = (__bridge_transfer NSString*)s2;
        //等效于
        //NSString *fstring1 = (NSString*)CFBridgingRelease(s2);
        
        
 /* 转换后ARC不再继续管理,需要手动释放 */
        CFStringRef cfstring1 = (__bridge_retained CFStringRef)s1;
        //等效于
        //CFStringRef cfstring1 = (CFStringRef)CFBridgingRetain(s1);

还有一篇 iOS __bridge那些事讲的也很详细,可以参考一下。

2021音乐教师招聘考试-单项选择_10(精选试题).doc
11-21
9、The bride and groom promised to ( ) each other through sickness and health. 答案:D. cherish 新人承诺无论健康还是疾病都会珍惜对方,"cherish"意为“珍爱”。 10、You cannot imagine how I feel ( ) ...
bride:用于ROS开发的BRIDE IDE
04-27
BRIDE是基于Eclipse的模型驱动工程工具链,用于开发ROS组件,系统和应用程序。 安装 从官方ROS资料库中 $ sudo apt-get install ros-hydro-bride 从来源 $ mkdir -p ~ /git/bride_ws/src (or somewhere else) $ cd ...
江苏省张家港市崇真中学2016_2017学年高二英语下学期周考3含解析
08-06
cky expressed his love for his bride 是一个句子,但是缺少了一个关联词来引导,结合先行词 "The most exciting moment" 可知,这是一个表示时间的名词短语,因此这里需要一个关系副词 when 来引导非限制性定语...
EventbriteDataVisualizations:此 repo 包含来自 Event Bride 的数据分析和数据可视化
06-15
开发平台和语言Python、 、 、jQuery作者计算机科学研究生, 石溪大学, 美国纽约执照GNU GPL v2(请阅读许可文件)可视化本节列出了为此项目开发的各种可视化世界各地事件的地理位置热图(与谷歌地图集成) 美国...
Find-bride ChatOS automatic email sender-crx插件
04-02
语言:русский ...Chatos Extensions - 唯一正式允许和认证的自动邮件网站Find-Bride.com以搜索对话者。下载 - 大胆地工作!免费时事通讯测试 - 3天!祝你好运!更多信息 - 在chatoptimizer.com网站
Sqlite修改数据库表名修改、增加字段
热门推荐
如鱼得水的专栏
07-02 4万+
SQLite 仅仅支持 ALTER TABLE 语句的一部分功能,我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列),但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称、数据类型、限定符等等。         改变表名 - ALTER TABLE 旧表名 RENAME TO 新表名         增加一列 - ALTER TABLE 表
H5页面WebView在iPhoneX的适配
如鱼得水的专栏
05-03 1万+
1.  iPhoneX的介绍屏幕尺寸    我们熟知的iPhone系列开发尺寸概要如下:△ iPhone各机型的开发尺寸转化成我们熟知的像素尺寸:△ 每个机型的多维度尺寸倍图其实就是像素尺寸和开发尺寸的倍率关系,但这只是外在的表现。倍图核心的影响因素在于PPI(DPI),了解屏幕密度与各尺寸的关系有助于我们深度理解倍率的概念:《基础知识学起来!为设计师量身打造的DPI指南》iPhone8在本次升级...
Core Animation之CATransform3D:矩阵变换3D旋转
如鱼得水的专栏
04-28 1万+
关于图层的几个坐标系。 对于ios来说,坐标系的(0,0)点在左上角,就是越往下,Y值越大。越往右,X值越大。 一个图层的frame,它是position,bounds,anchorPoint和transform属性的一部分。 设置一个新的frame将会相应的改变图层的position和bounds,但是frame本身并没有保存。 position:是一个CGP
mac上mysql不能插入中文问题
如鱼得水的专栏
07-13 6811
编码问题需要设置成统一的编码格式才行,命令行进去mysql mysql -u root -p 输入命令查看当前数据库的编码格式: show variables like 'character_set_%'; 如果和下面一致就没问题: mysql> show variables like 'character_set_%'; +--------------------------
Xcode6的新特性、iPhone6和iPhone6Plus的适配
如鱼得水的专栏
09-15 6068
今年苹果发布会已经结束,但人们貌似对iPhone6和iPhone6plus不太感兴趣,而对iWatch非常期待。这次苹果一次发布两种屏幕大小的手机,而且与之前的机型的屏幕大小都不一样。这对开发者来说,无疑是最担心的事了,之前的app在iPhone6和iPhone6Plus上会不会布局全乱了呢?         不用担心苹果肯定会考虑到这些问题的:    虽然屏幕分辨率变了很多,但是
图片转换base64字符串及字符串反转回图片
如鱼得水的专栏
04-21 5558
最近做一个上传图片功能时,后台让把图片转成字符串后上传,感到很不解。。。     后来在网上查到一些资料,还真有这么搞的,但不知道意义何在,有什么好处呢?知道的小伙伴给回复下啊     顺便把字符串和图片互转的方法贴在这,就是把base64Encoding编码的字符串作为中介: 图片转base64串:     UIImage *_originImage = [UIIma
预览doc、xslx等Office文档和pdf以及Quicklook中QLPreviewController
如鱼得水的专栏
05-20 5106
在app中我们有时候需要查看一些电脑上的文件,比如常用的Office文件和pdf等,首先想到的是试试用UIWebView加载文件,其实还有一种方法就是用iOS4.0及之后的SDK自带的一种预览的视图控制器来打开文件。但是注意,不管是用上面哪种方法,都不能修改打开的文件,只能是个预览的作用; 方法一: 用UIWebView加载文件 -(void)loadDocument {  
Apple Watch开发(三)--WatchKit简介和Watch适配、布局
如鱼得水的专栏
04-27 5101
上篇简单介绍了创建了一个Apple Watch开发的project的过程,那么对于新生成的文件有什么用呢?老项目怎么适配Apple Watch呢?下面我就来简单介绍下WatchKit和Watch项目中的文件作用、及其布局特点。   一、 旧项目适配Apple Watch        普通老项目可以添加Apple Watch吗?需要注意什么?有些人直接在旧的项目中,按照上篇写的那样去添加一个
第三方静态库编译:ZBar编译libZbar.a
如鱼得水的专栏
03-25 4216
有的工程里用到第三方库了,打包的时候还会提示下面的问题: ld: file is universal (3 slices) butdoes not contain a(n) armv7s slice:/Users/rainbird/Desktop/myapp/iFileManager/iFileManager/ZBarSDK/libzbar.afor architecture armv7
Apple Watch开发(二)--Xcode创建项目及其结构
如鱼得水的专栏
04-26 3944
在上一篇文章中介绍了Apple Watch的特点和app运行模式,那么这篇我们来看下如何利用Xcode创建一个Apple Watch的project。 一、 运行环境       首先我们来用这个Xcode创建Watch app的时候肯定要注意开发环境,Watchkit是在Xcode6.2beta版本加入的,所以我们需要:      1、     电脑系统在Mac OS10.9.4以上;
适配iPhoneX和Xcode9
如鱼得水的专栏
11-07 3462
iPhone X的适配 1、iPhone X, 5.8 英寸,屏幕分辨率为 1242 x 2800 除去底部固定的功能区,屏幕显示范围的尺寸为 5.15 英寸,458ppi。 竖屏尺寸:1125px × 2436px(375pt × 812pt @3x) 横屏尺寸:2436px × 1125px(812pt × 375pt @3x) iPhone 7 设备渲染后分辨率
zBar扫描二维码时闪光灯自动打开问题
如鱼得水的专栏
07-01 3444
相信大家对zBar并不陌生,比较常用的扫描二维码和条形码的第三方库,在这不做过多解释。       我要说的是,有种场景我们在扫描二维码时,周围环境比较阴暗,光线不好,这个时候我们需要去开灯。这个时候的需求是我们如果能打开手机自带的闪光灯就好了。          到这一步并不难,网上也有很多关于打开手机闪光灯的代码,在这里我也贴出来一份: - (void)openLight:(UIButt
Mac上Apache部署本地PHP工程虚拟地址
如鱼得水的专栏
07-14 2892
最近自学PHP,在这简单说下PHP工程怎么用电脑的浏览器去访问。 我用的是mac系统,开发工具是Zend Studio,Apache/2.4.18。 比如我们要设置本机的虚拟域名为my.com 一、首先找到Apache的安装目录:我的是在/private/etc/apache2 在此目录下找到文件httpd.conf,在文件内容的中间位置有下面两行: # Virtual host
iOS中的NSRunloop的简介与滚动视图时停止加载的问题
如鱼得水的专栏
03-18 2876
最早接触runloop的概念,是第一次用NSTimer的时候。一个最简单的例子: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSTimer * timer = [NSTimer sch
Bridegroom、aunty、bride的静态代理
最新发布
05-04
下面是Bridegroom、aunty、bride的静态代理的示例代码: 首先定义一个接口: ```java public interface Marry { void marry(); } ``` Bridegroom实现Marry接口: ```java public class Bridegroom implements ...
写文章

热门文章

  • 连接mysql报错:error 2003 (hy000):can't connect to mysql server on 'localhost' (10061) 40613
  • Sqlite修改数据库表名修改、增加字段 40501
  • iOS8推送消息的快速回复处理 22142
  • H5页面WebView在iPhoneX的适配 16125
  • Core Animation之CATransform3D:矩阵变换3D旋转 15549

分类专栏

  • iOS编程 153篇
  • Apple Watch 3篇
  • swift 3篇
  • 网络开发 13篇
  • iOS8 17篇
  • xmpp 4篇
  • AppStore相关 18篇
  • iMac 6篇
  • Wax Lua 6篇
  • C/C++ 3篇
  • cocos2d 1篇
  • cocos2d-x
  • PHP 4篇
  • Java 6篇
  • html5 1篇
  • Android 2篇
  • 数据库 12篇
  • 电脑 27篇
  • 笔记 61篇
  • 杂谈 3篇

最新评论

  • 黑客 cmd大全

    ꧁: at /delete 这个是不是可以理解为封号表情包

  • 图片转换base64字符串及字符串反转回图片

    安静805: 你好 请问这个怎么用

  • Runtime动态创建一个类和修改方法的操作

    HiccupTang: 将class,改成object_getClass(class)即获取元类,即可替换类方法。因为类方法存放在元类里面

  • H5页面WebView在iPhoneX的适配

    weixin_43876114: constant在编辑器报错是什么鬼

  • iOS监听多个异步请求全部返回和多任务下载

    qq_45284475: 我想看到别人微信聊天有没有这方面软件吗?

最新文章

  • 使用shell脚本自动合并framework
  • 使用xcworkspace调试framework源码
  • iOS创建framework静态库(SDK&组件化)
2020年3篇
2019年15篇
2018年2篇
2017年3篇
2016年8篇
2015年35篇
2014年116篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家漳州玻璃钢卡通雕塑厂家商场开学季美陈温州玻璃钢仿真水果雕塑透明玻璃钢雕塑公园装饰学校玻璃钢雕塑定做价格重庆公园玻璃钢雕塑生产厂家寿光玻璃钢花盆花器宜宾玻璃钢花盆花器现代人物玻璃钢雕塑行情广东广州玻璃钢肖像雕塑温州广场玻璃钢雕塑加工永泰玻璃钢雕塑厂家双鸭山玻璃钢雕塑制作浙江玻璃钢校园雕塑益阳商场美陈花器玻璃钢园林雕塑定制承诺守信湖南特色玻璃钢雕塑商场香皂美陈图片民俗玻璃钢雕塑玻璃钢人物雕塑加盟东台玻璃钢工艺品雕塑许昌玻璃钢不锈钢树叶雕塑玻璃钢雕塑如何上色天津大型商场创意商业美陈怎么做汕头玻璃钢农耕人雕塑安阳玻璃钢浮雕雕塑价格报价泰式玻璃钢花盆的高度和尺寸张掖玻璃钢动物雕塑多少钱山东卡通玻璃钢动物鹿雕塑买玻璃钢景观雕塑注意什么香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化