近来没什么新项目作,想学习一些swift开源项目,看了几个文件感受有点懵,可能水平还没达到,等用到具体内容的时候再去仔细看吧。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,又报其它错误ui
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
对象释放以后仍然有使用,建立对象,使用完毕后释放对象,很对的,难道什么地方写得不对吗?spa
在stackoverflow上找到相似的问题及解决方法,比较以后发现是须要从新拷贝一份uuid对象,由于在调用CFRelease以后,以前的uuid会被释放掉,再把以前的uuid做为函数返回值返回时,就会报错。code
最后正确的写法改成对象
//(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
看左侧的博客目录发现三月份居然一篇都没有写,上个月是有点荒废了,事情有点多。以后尽可能保持每个月至少一篇技术博客,多学习一些东西,找到值得记录的内容。加油吧!blog