zoukankan      html  css  js  c++  java
  • CoreFoundation对象的内存管理

    近来没什么新项目做,想学习一些swift开源项目,看了几个文件感觉有点懵,可能水平还没达到,等用到具体内容的时候再去仔细看吧。

    关于现在的项目,想想单元测试还可以完善一下,就在framwork工程中写了一些测试用例。准备开始测试之前,先用product-analyze(快捷键cmd+shift+b)分析一下,发现有未释放的对象。

        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        NSString *strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));
        NSData *deviceid = [strUUID dataUsingEncoding:NSUTF8StringEncoding];
        CFRelease(uuidRef);//Potential leak of an object stored into 'uuidRef'

    原来是在创建uuid的方法中,没有释放uuidRef这个cf对象,最后加上CFRelease就可以了。

    但是在上面的第二行代码中,有CFBridgingRelease方法,表示把cf对象转换为oc对象,包括所有权转换,之后可以由arc自动释放对象。

    再仔细看过后,发现原来上面的代码中其实有两个cf对象,把第二行中拆分成下面这样,其中__bridge可以把cf对象转为oc对象,不包括所有权转换,所以最后面有CFRelease释放stringRef对象。

    再次运行analyze,又报其它错误

        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        CFStringRef stringRef = CFUUIDCreateString(kCFAllocatorDefault,uuidRef);
        NSString *uuid = (__bridge NSString *)stringRef;
        NSData *deviceId = [uuid dataUsingEncoding:NSUTF8StringEncoding];
        CFRelease(uuidRef);//Potential leak of an object stored into 'uuidRef'
        CFRelease(stringRef);//Reference-counted object is used after it is released

    对象释放之后仍然有使用,创建对象,使用完毕后释放对象,很对的,难道什么地方写得不对吗?

    在stackoverflow上找到类似的问题及解决方法,比较之后发现是需要重新拷贝一份uuid对象,因为在调用CFRelease之后,之前的uuid会被释放掉,再把之前的uuid作为函数返回值返回时,就会报错。

    最后正确的写法改为

        //(NSString *)CFBridgingRelease(stringRef) 相当于__bridge__transfer把cf对象转成oc对象,所有权也由cf转到oc,arc下会自动释放
        //__bridge 只是把cf对象转为oc,不包含所有权的转换
        //CFBridgingRetain(id) 相当于__bridge__retained把oc对象转为cf对象,所有权也由oc转到cf,需要手动释放
        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        CFStringRef stringRef = CFUUIDCreateString(kCFAllocatorDefault,uuidRef);
        NSString *uuid = [NSString stringWithString:(__bridge NSString *)stringRef];
        NSData *deviceId = [uuid dataUsingEncoding:NSUTF8StringEncoding];
        CFRelease(uuidRef);//Potential leak of an object stored into 'uuidRef'
        CFRelease(stringRef);//Reference-counted object is used after it is released

    看左侧的博客目录发现三月份竟然一篇都没有写,上个月是有点荒废了,事情有点多。之后尽量保持每月至少一篇技术博客,多学习一些东西,找到值得记录的内容。加油吧!

  • 相关阅读:
    Rainmeter 雨滴桌面 主题分享
    行人检測之HOG特征(Histograms of Oriented Gradients)
    const和readonly差别
    ADB命令解析
    Java实现 蓝桥杯VIP 算法训练 接水问题
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
  • 原文地址:https://www.cnblogs.com/shenyuiOS/p/10650382.html
Copyright © 2011-2022 走看看