近來沒什麼新項目作,想學習一些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