全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS允许Objective-C和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力:1. CFStringRef aCFString = (CFStringRef)aNSString; 2. NSString *aNSString = (NSString *)aCFString; CFStringRef aCFString = (CFStringRef)aNSString;NSString *aNSString = (NSString *)aCFString;针对内存管理问题,ARC 可以帮忙管理 Objective-C 对象, 但是不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象。 本文重点总结一下类型转换后的内存管理。一、非ARC的内存管理倘若不使用ARC,手动管理内存,思路比较清晰,使用完,release转换后的对象即可。1. /NSString 转 CFStringRef2. CFStringRef aCFString = (CFStringRef) NSString alloc initWithFormat:%, string; 3. /.4. CFRelease(aCFString); 5. /CFStringRef 转 NSString6. CFStringRef aCFString = CFStringCreateWithCString(kCFAllocatorDefault, 7. bytes, 8. NSUTF8StringEncoding); 9. NSString *aNSString = (NSString *)aCFString; 10. /.11. aNSString release; /NSString 转 CFStringRefCFStringRef aCFString = (CFStringRef) NSString alloc initWithFormat:%, string;/.CFRelease(aCFString);/CFStringRef 转 NSStringCFStringRef aCFString = CFStringCreateWithCString(kCFAllocatorDefault, bytes, NSUTF8StringEncoding);NSString *aNSString = (NSString *)aCFString;/.aNSString release;二、ARC下的内存管理ARC的诞生大大简化了我们针对内存管理的开发工作,但是只支持管理 Objective-C 对象, 不支持 Core Foundation 对象。Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理。那么当使用Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,到底由谁来负责释放对象,是否交给ARC处理。只有正确的处理,才能避免内存泄漏和double free导致程序崩溃。根据不同需求,有3种转换方式 _bridge (不改变对象所有权) _bridge_retained 或者 CFBridgingRetain() (解除 ARC 所有权) _bridge_transfer 或者 CFBridgingRelease() (给予 ARC 所有权)1. _bridge_retained 或者 CFBridgingRetain()_bridge_retained 或者 CFBridgingRetain() 将Objective-C对象转换为Core Foundation对象,把对象所有权桥接给Core Foundation对象,同时剥夺ARC的管理权,后续需要开发者使用CFRelease或者相关方法手动来释放对象。来看个例子:1. - (void)viewDidLoad 2. 3. super viewDidLoad; 4. NSString *aNSString = NSString allocinitWithFormat:test; 5. CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString; 6. (void)aCFString; 7. /正确的做法应该执行CFRelease8. /CFRelease(aCFString);9. - (void)viewDidLoad super viewDidLoad; NSString *aNSString = NSString allocinitWithFormat:test; CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString; (void)aCFString; /正确的做法应该执行CFRelease /CFRelease(aCFString); 程序没有执行CFRelease,造成内存泄漏:CFBridgingRetain() 是 _bridge_retained 的宏方法,下面两行代码等价:1. CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString; 2. CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString); CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString;CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);2. _bridge_transfer 或者 CFBridgingRelease()_bridge_transfer 或者 CFBridgingRelease() 将非Objective-C对象转换为Objective-C对象,同时将对象的管理权交给ARC,开发者无需手动管理内存。接着上面那个内存泄漏的例子,再转成OC对象交给ARC来管理内存,无需手动管理,也不会出现内存泄漏:1. - (void)viewDidLoad 2. 3. super viewDidLoad; 4. NSString *aNSString = NSString allocinitWithFormat:test; 5. CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString; 6. aNSString = (_bridge_transfer NSString *)aCFString; 7. - (void)viewDidLoad super viewDidLoad; NSString *aNSString = NSString allocinitWithFormat:test; CFStringRef aCFString = (_bridge_retained CFStringRef) aNSString; aNSString = (_bridge_transfer NSString *)aCFString;CFBridgingRelease() 是_bridge_transfer的宏方法,下面两行代码等价:1. aNSString = (_bridge_transfer NSString *)aCFString; 2. aNSString = (NSString *)CFBridgingRelease(aCFString); aNSString = (_bridge_transfer NSString *)aCFString; aNSString = (NSString *)CFBridgingRelease(aCFString);3. _bridge_bridge 只做类型转换,不改变对象所有权,是我们最常用的转换符。从OC转CF,ARC管理内存:1. - (void)viewDidLoad 2. 3. super viewDidLoad; 4. NSString *aNSString = NSString allocinitWithFormat:test; 5. CFStringRef aCFString = (_bridge CFStringRef)aNSString; 6. (void)aCFString; 7. - (void)viewDidLoad super viewDidLoad; NSString *aNSString = NSString allocinitWithFormat:test; CFStringRef aCFString = (_bridge CFStringRef)aNSString; (void)aCFString;从CF转OC,需要开发者手动释放,不归ARC管:1. - (void)viewDidLoad 2. 3. super viewDidLoad; 4. CFStringRef aCFString = CFStringCreateWithCString(NULL,test, kCFStringEncodingASCII); 5. NSString *aNSString = (_bridge NSString *)aCFString; 6. (void)aNSString; 7. CFRelease(aCFString); 8. - (void)viewDidLoad super viewDidLoad; CFStringRef aCFStri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 核电厂辐射防护工程师技能提升培训方案
- 赣南师范大学科技学院2026年公开招聘工作人员(一)考试笔试参考题库及答案解析
- 固定资产价值评估
- 2025年西安盛阳文化传媒有限公司招聘考试笔试模拟试题及答案解析
- 2025山东潍坊市福乐源康复养老中心护理人员招聘8人笔试考试备考试题及答案解析
- 谈判技巧培训
- 2026江西吉安共青团中央所属事业单位社会人员招聘18人考试笔试备考试题及答案解析
- 2025福建厦门市集美区宁宝幼儿园非在编教辅招聘2人考试笔试备考题库及答案解析
- 2025湖北省大学生乡村医生专项计划招聘386人笔试考试备考试题及答案解析
- 2026“青囊X锐 广药聘U”广药集团校园招聘笔试考试参考试题及答案解析
- 2025年及未来5年市场数据中国直升飞机市场全面调研及行业投资潜力预测报告
- 铜绿假单胞菌感染护理
- 2025国家粮食储备局考试真题与答案
- 2025版妊娠期和产褥期脑静脉血栓形成管理指南解读课件
- 良品铺子营运能力分析及对策研究
- 2024年小学六年级上册语文课外阅读练习题及答案
- 药房培训计划试题及答案
- 2025年国开期末考试3672《液压与气压传动》机考试题及答案
- 特种设备应急处置课件
- 新能源专业面试问题及答案
- 2025年科研年度个人工作总结(3篇)
评论
0/150
提交评论