OC对象与CF对象的相互转换 和 ARC下查看OC对象的引用计数

Posted SSIrreplaceable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC对象与CF对象的相互转换 和 ARC下查看OC对象的引用计数相关的知识,希望对你有一定的参考价值。

  • 注意:文中的OC对象指Objective-C对象,CF对象指Core Foundation中的对象

  • 转换方法:
    (__bridge type)expression
    (__bridge_retained CF type)expression
    (__bridge_transfer Objective-C type)expression

一. OC对象与CF对象的相互转换

1. OC对象转CF对象

- (void)OFConvertOC 

    CFStringRef stringCF = (CFStringRef)@"OF对象 --> OC对象";

    NSString *stringOC1 = (__bridge NSString *)stringCF; // 方式一
    NSString *stringOC2 = (__bridge_transfer NSString *)stringCF; // 方式二

    NSLog(@"%@", stringOC1);
    NSLog(@"%@", stringOC2);

2. OF对象转OC对象

- (void)OCConvertCF 

    NSString *stringOC = @"OC对象 --> CF对象";

    CFStringRef stringCF1 = (__bridge CFStringRef)stringOC; // 方式一
    CFStringRef stringCF2 = (__bridge_retained CFStringRef)stringOC; // 方式二,但stringCF2引用计数会加1

    NSLog(@"%@", stringCF1);
    NSLog(@"%@", stringCF2);

二. ARC下查看OC对象的引用计数

- (void)seeRetainCountFromARC 

    NSObject *objOC = [[NSObject alloc] init];
    CFTypeRef objCF = (__bridge CFTypeRef)objOC;


    // 最初的引用计数
//    NSInteger retainCount = CFGetRetainCount(objCF);
    // 这里可以不用以__bridge前缀转换,但是如果拆开就得加上__bridge
    NSInteger retainCount = CFGetRetainCount((CFTypeRef)objOC);
    NSLog(@"最初 --- 引用计数 --- %ld", retainCount);


    // 引用计数加1
    CFRetain(objCF);
    NSLog(@"retain --- 引用计数 --- %ld", CFGetRetainCount(objCF));

    // 引用计数减1
    CFRelease(objCF);
    NSLog(@"release --- 引用计数 --- %ld", CFGetRetainCount(objCF));

    // 使用__bridge_retained为前缀转换,引用计数会加1
    objCF = (__bridge_retained CFTypeRef)objOC;
    NSLog(@"__bridge_retained --- 引用计数 --- %ld", CFGetRetainCount(objCF));


    // 当把objOC设为nil,在ARC下引用计数为0,系统会自动销毁objOC对象
    objOC = nil;

以上是关于OC对象与CF对象的相互转换 和 ARC下查看OC对象的引用计数的主要内容,如果未能解决你的问题,请参考以下文章

OC 内存管理:MRC与ARC

OC加强之ARC

[OC学习笔记]ARC与引用计数

OC基础--ARC的基本使用

[OC学习笔记]ARC与引用计数

[OC]MRC和ARC