3

以下泄漏:我還可以如何避免泄漏此Core Foundation對象?

CFStringRef labelName = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row)); 
    cell.textLabel.text = (NSString *)labelName; 
    CFRelease(labelName); 

想知道如果有一種方式來重寫它,所以它並沒有打破&分配ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row)CFStringRef,我則需要手動CFRelease 2線後泄漏?當然,做這件事並不是什麼大事......我只是好奇而已。

編輯:CFAutoRelease會工作嗎?看到我的評論如下

回答

2

由於複製/獲取語義,您需要發佈任何來自API的CopyABMultiValueCopyLabelAtIndex符合該要求,所以很遺憾,您需要獲取此參考資料並在稍後發佈。

+1

'CFAutoRelease'怎麼樣?可以'CFStringRef labelName = ABAddressBookCopyLocalizedLabel(CFAutoRelease(ABMultiValueCopyLabelAtIndex(aMultiRef,indexPath.row)));'工作? – Meltemi 2010-03-11 01:40:22

+1

沒有'CFAutoRelease';你應該將引用存儲到臨時創建的局部變量中,並在完成時存儲'CFRelease'。 – rpetrich 2010-03-11 01:43:00

+2

@rpetrich在iOS7 SDK中,CFAutorelease在CoreFoundation/CFBase.h – thandasoru 2014-01-05 09:02:57

0

你可以使用Objective-C自動釋放(只要你有一個池)。只需先投入ID即可。例如。 [(id)labelName autorelease]將正常工作,它是完全合法的(因爲CFStringRef是和NSString橋接免費)。實際上,你可以使用任何基於CoreFoundation的類型來做到這一點,儘管我不相信蘋果公開在文檔中公開證明這一點,但這可能會改變。