Objective-C和CoreFoundation对象相互转换的内存管理总结.doc_第1页
Objective-C和CoreFoundation对象相互转换的内存管理总结.doc_第2页
Objective-C和CoreFoundation对象相互转换的内存管理总结.doc_第3页
Objective-C和CoreFoundation对象相互转换的内存管理总结.doc_第4页
Objective-C和CoreFoundation对象相互转换的内存管理总结.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论