我正在使用ARC,並且我的應用程序編譯並無崩潰地工作。但是,當我運行分析版本時,我看到了這些警告。我自然來自PHP和JavaScript,所以我不知道該如何解決這個問題。誰能幫我嗎?在iOS6中使用地址簿聯繫人時發生內存泄漏
回答
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可以爲您做到這一點。
(注:我沒有測試這一點,但我相信這些都是靜態分析儀抱怨的問題)
所以!即使您正在使用自動引用計數(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/
我用盧卡斯的bridge_transfer以及你的推薦CFRelease(addressFromPerson);.希望我可以將兩個答案都標記爲已接受,因爲每個答案都有幫=]相反,有一個upvote! –
@Kirk酷豆,快樂編碼! –
是,您可以使用:
NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person);
Bu t蘋果現推薦使用:
NSArray *linkedPeople = CFBridgingRelease(ABPersonCopyArrayOfAllLinkedPeople(person));
它做同樣的事情,但Apple建議您使用後者。
參見WWDC 2012 session 405,37:33進入演示文稿。
- 1. 存儲地址簿聯繫人的kABPersonImageFormatThumbnail
- 2. 使用PowerShell時發生內存泄漏
- 3. 使用stringwithformat時發生內存泄漏
- 4. 使用UIwebview時發生內存泄漏
- 5. 使用MWPhotoBrowser時發生內存泄漏
- 6. 使用performSelectorInBackground時發生內存泄漏
- 7. 使用CLLocationCoordinate2D時發生內存泄漏
- 8. 使用NSPropertyListSerialization時發生內存泄漏
- 9. 導入多個聯繫人到地址簿iOS6的\ Xcode的
- 10. 撥打地址簿中的聯繫人
- 11. 從地址簿中顯示聯繫人
- 12. 地址簿 - 正在檢索聯繫人
- 13. 地址簿中的內存泄漏問題iOS
- 14. InputStream發生內存泄漏?
- 15. 在draw-call中使用glDisable(GL_TEXTURE_2D)時發生內存泄漏
- 16. 在Objective-C中使用TBXML時發生內存泄漏
- 17. 在cvFindContours中使用CvSeq時發生內存泄漏
- 18. 在Node.js中使用流時會發生內存泄漏?
- 19. 在一個循環中使用NSReadPixel時發生內存泄漏
- 20. 從地址簿獲取Facebook聯繫人
- 21. iphone調出地址簿聯繫人
- 22. 地址簿 - 鏈接聯繫人
- 23. 內存泄漏 - 它們何時發生?
- 24. 定時器發生內存泄漏
- 25. 在地址簿中獲取聯繫人更新/創建時間
- 26. 刪除聯繫人組中的人(在Mac地址簿中)
- 27. 存儲到地址簿中的對象的潛在泄漏
- 28. 如何使用地址簿聯繫人詳細信息在iPhone中生成vcard?
- 29. 使用Xamarin Forms從地址簿中讀取聯繫人
- 30. 使用personViewController從地址簿中刪除聯繫人
但請記住'__bridge_transfer'只能在從C指針轉換爲對象指針時使用。他的一個靜態分析器問題涉及到一個'ABMultiValueRef',它可以在技術上被轉換爲類型爲「ABMultiValue」的Objective-C對象並與'__bridge_transfer'一起使用,但是他沒有在這裏使用這個類型。 –
使用了兩個建議的組合,沒有更多的分析警告!謝謝你們倆! –
雖然它是一樣的,Apple現在推薦'CFBridgingRelease()'。 – Rob