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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值