2012-12-01 24 views

回答

4

ARC與核心基礎打交道時需要一些幫助。嘗試:

NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person); 

NSDictionary *personDictionary = (__bridge_transfer NSDictionary *)(ABMultiValueCopyValueAtIndex(addressFromPerson, 0)); 

__bridge_transfer告訴ARC一個非目標C(即,核心基礎)指針被移動到一個Objective-C的指針,並且它允許ARC到爲了內存管理目的而取得對象的所有權。具有單詞「copy」的CF在其中產生具有+1引用計數的對象引用。如果您以後未明確地在對象上調用CFRelease(),則會泄漏。然而,使用__bridge_transfer,ARC可以爲您做到這一點。

(注:我沒有測試這一點,但我相信這些都是靜態分析儀抱怨的問題)

+1

但請記住'__bridge_transfer'只能在從C指針轉換爲對象指針時使用。他的一個靜態分析器問題涉及到一個'ABMultiValueRef',它可以在技術上被轉換爲類型爲「ABMultiValue」的Objective-C對象並與'__bridge_transfer'一起使用,但是他沒有在這裏使用這個類型。 –

+0

使用了兩個建議的組合,沒有更多的分析警告!謝謝你們倆! –

+0

雖然它是一樣的,Apple現在推薦'CFBridgingRelease()'。 – Rob

1

所以!即使您正在使用自動引用計數(ARC),它仍然對Objective-C的內存管理讀了一個好主意:

http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

但是,對於您的具體問題:

一般來說,當您在Apple框架中看到一個名爲Copy的C方法時,您將獲得該Core Foundation類型的所有權,並且您需要釋放它。當你想釋放該類型時,只需使用:

CFRelease(addressFromPerson) 

這是第一個問題。您的截圖切斷了第二個錯誤,所以我只是在猜測,但我認爲您還需要釋放NSDictionary *personDictionary。同理:

CFRelease(personDictionary) 

請注意,您還需要管理內存linkedPeople

通常ARC會照顧內存管理你,但與核心基礎類型的工作時,你仍然需要清理追隨你自己。

我會強烈建議你看看這些偉大的資源上的內存管理與ARC,特別是CF類型和免費橋接打交道時:

http://www.joergjacobsen.com/blog/2011/10/05/managing-toll-free-bridging-in-an-arced-environment/

http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

+0

我用盧卡斯的bridge_transfer以及你的推薦CFRelease(addressFromPerson);.希望我可以將兩個答案都標記爲已接受,因爲每個答案都有幫=]相反,有一個upvote! –

+1

@Kirk酷豆,快樂編碼! –

2

是,您可以使用:

NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person); 

Bu t蘋果現推薦使用:

NSArray *linkedPeople = CFBridgingRelease(ABPersonCopyArrayOfAllLinkedPeople(person)); 

它做同樣的事情,但Apple建議您使用後者。

參見WWDC 2012 session 405,37:33進入演示文稿。

相關問題