iOS:Foundation与CoreFoundation

目录
一,基本概念
二,内存管理
三,互相转换
四,简便方法

一,基本概念

1,Foundation:OC类库,NS开头

NSString,NSArray,NSDictionary...

2,CoreFoundation:C类库,CF开头

CFString,CFArray,CFDictionary...
二,内存管理

1,Foundation

  • MRC环境下由程序员手动管理,创建的对象需要手动调用release进行释放
  • ARC环境下由系统自动管理,创建的对象系统会自动调用release进行释放

2,CoreFoundation

  • 任何环境下都由程序员手动管理,只要使用名称包含create/new/retain/copy的函数创建出来的,都需要手动调用release进行释放
三,互相转换

1,转换前后是同一个对象,只需要释放一次

// OC -> C
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge CFStringRef)ocStr1;
NSLog(@"%p---%p", ocStr1, cStr1);

// C -> OC
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge NSString *)cStr2;
NSLog(@"%p---%p", cStr2, ocStr2);
CFRelease(cStr2);

// 打印
0xff6a5d565a54bce8---0xff6a5d565a54bce8
0xff6a5d565a04ccb8---0xff6a5d565a04ccb8

2,MRC:强制转换

// OC -> C
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (CFStringRef)ocStr1;

// C -> OC
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (NSString *)cStr2;
CFRelease(cStr2);

3,ARC

  • 对象内存管理权不转移:__bridge
// OC -> C:内存管理权仍然在ocStr1(Foundation)这边
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge CFStringRef)ocStr1;

// C -> OC:内存管理权仍然在cStr2(CoreFoundation)这边
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge NSString *)cStr2;
CFRelease(cStr2);
  • 对象内存管理权转移:__bridge_retained__bridge_transfer
// OC -> C:内存管理权从ocStr1(Foundation)转移到cStr1(CoreFoundation)
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge_retained CFStringRef)ocStr1;
CFRelease(cStr1);

// C -> OC:内存管理权从cStr2(CoreFoundation)转移到ocStr2(Foundation)
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge_transfer NSString *)cStr2;
四,简便方法

1,CFBridgingRetain = __bridge_retained

从名称中可以看出cStr1是retain得来的,所以需要调用release

NSString *ocStr1 = [NSString stringWithFormat:@"123"];
//CFStringRef cStr1 = (__bridge_retained CFStringRef)ocStr1;
CFStringRef cStr1 = CFBridgingRetain(ocStr1);
CFRelease(cStr1);

2,CFBridgingRelease = __bridge_transfer

从名称中可以看出cStr2已经release,所以无需再调用release

CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
//NSString *ocStr2 = (__bridge_transfer NSString *)cStr2;
NSString *ocStr2 = CFBridgingRelease(cStr2);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为什么进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时...
    天天想念阅读 4,410评论 1 6
  • category 和 extension 的区别 -分类有名字,类扩展没有分类名字,是一种特殊的分类 -分类只能扩...
    白羊的羊阅读 3,114评论 0 1
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,312评论 1 27
  • 一、category 和 extension 的区别?(分类和扩展的区别) 1,分类有名字,类扩展没有名字,是一种...
    闪电迷阅读 4,077评论 0 3
  • 自动引用计数 (ARC,Automatic Reference Counting) 1.1 什么是自动引用计数? ...
    emmet7life阅读 2,895评论 0 0

友情链接更多精彩内容