近来没什么新项目做,想学习一些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

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

CoreFoundation对象的内存管理的更多相关文章

  1. Objective-C之集合对象的内存管理

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. oc-31-多对象的内存管理

    在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...

  3. block没那么难(三):block和对象的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 ...

  4. Java进阶2 数组内存和对象的内存管理知识

    Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...

  5. oc56--ARC多个对象的内存管理

    // main.m // ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码: / ...

  6. 用"僵尸对象"调试内存管理问题

    Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...

  7. oc对象的内存管理

    oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理: oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象:当计数器为0时该对象会从内存 ...

  8. oc55--ARC单个对象的内存管理

    // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #i ...

  9. iOS 对象的内存管理细节

    通过类创建对象 1.创建对象时,开辟存储空间,通过new方法创建的对象会在 堆 内存中开辟一块存储空间 2初始化所有属性都在堆内存中完成 3.返回值真地址,指针在栈内存中,指针指向的地址是堆里创建对象 ...

随机推荐

  1. MVC与单元测试实践之健身网站(三)-角色与权限

    管理员的维护功能完成后,还有权限和角色,三者构成权限系统.这里采用的RBAC是最经典.最简单的一种,权限-角色-管理员只能层层传递,并不能直接为管理员分配权限. 一 权限.角色管理 a) 权限 之前编 ...

  2. Android 开源库和项目 3

    Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...

  3. webpack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  4. PHP多进程编之pcntl_fork

    其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全也可以使用PHP来进行系统工具类的编程,做监控或 ...

  5. python常用模块之subprocess

    python常用模块之subprocess python2有个模块commands,执行命令的模块,在python3中已经废弃,使用subprocess模块来替代commands. 介绍一下:comm ...

  6. mysql Alter table设置default的问题,是bug么?

    不用不知道,用了没用? 昨天在线上创建了一个表,其中有两个列是timestamp类型的,创建语句假设是这样的: create table timetest(id int, createtime tim ...

  7. 如何把SQL Server中一个表,一个存储过程,一个视图等改为系统表,系统存储过程,系统视图等

    使用如下存储过程即可: EXEC sys.sp_MS_marksystemobject '[dbo].[TableNameToSystem]' 其中"[dbo].[TableNameToSy ...

  8. Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗

    提问: 如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗? 如果在.Net中用TransactionScope开启一个事务. 然后在该事务范围内启动两个 ...

  9. [cb]UIGrid+UIStretch的自适应

    自适应需求 如下图所示:一个Grid下面有六个Button,它们需要在不同的分辨下拉伸适应(Horizontal)宽度,以保证填充满底部 要点分析 首先有这两个要点 1.UIGrid中的Cell Wi ...

  10. Android5.0中Material Design的新特性

    最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...