经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
CoreFoundation对象的内存管理
来源:cnblogs  作者:yuyuyu37  时间:2019/4/3 18:03:00  对本文有异议

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

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

  1. CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
  2. NSString *strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));
  3. NSData *deviceid = [strUUID dataUsingEncoding:NSUTF8StringEncoding];
  4. 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,又报其它错误

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

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

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

最后正确的写法改为

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

 

 

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

原文链接:http://www.cnblogs.com/shenyuiOS/p/10650382.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号