2012-12-31 14 views
11

मैं एक अनुप्रयोग एआरसी का उपयोग करता है और उस पल में कुछ मेमोरी लीक करने के लिए लगता है कि लिख रहा हूँ के मालिक है। गुगलिंग मुझे इंस्पेक्टर का उपयोग करने के बारे में कुछ संकेत मिले। वहां मैं कुछ वर्गों के उदाहरणों के आवंटन के ढेर देख सकता हूं और मैं कुछ कॉल स्टैक भी देख सकता हूं कि ऑब्जेक्ट आवंटित किया गया था और कैसे बनाए रखा गिनती बदल गई।IOS अनुप्रयोग, लगता है जो एक वस्तु

लेकिन ऐसा लगता है मैं पूरा कॉल स्टैक नहीं देख सकते हैं तो मैं नहीं जानता कि जो अंत में वस्तु का मालिक है। यह मुझे लगता है कि यह मालिक किसी भी तरह वस्तु को जारी नहीं कर रहा है (या ऑब्जेक्ट जो संदिग्ध वस्तु का मालिक है)।

किसी को भी मुझे एक आवंटित वस्तु के मालिक खोजने पर एक संकेत दे सकते हैं?

कृपया ध्यान दें कि वस्तुओं के रूप में "लीक" चिह्नित नहीं कर रहे हैं लेकिन आवंटित के रूप में। मेरे लिए ऐसा लगता है जैसे वस्तुओं को लीक कर दिया गया है क्योंकि लगातार नई वस्तुओं को आवंटित किया जाता है।

कैसे सबसे अच्छा आगे बढ़ना और पाते हैं संदिग्ध लीक की सराहना कर रहे हैं पर कोई और सहायता की।

+0

गैर एआरसी के समान, आर्क मालिक के अधिकारों को बदलता नहीं है –

+0

हाथ में समस्या को वापस लेना: क्या आप हमें अपने कोड के बारे में और बता सकते हैं? क्या आप CoreFoundation ऑब्जेक्ट्स पर कॉल कर रहे हैं? क्या आप उन लाइनों की आपूर्ति कर सकते हैं जहां आपको लगता है कि कुछ लीक हो रहा है? नमूना कोड यहां सहायक होगा, मुझे लगता है। – lxt

+1

@ दाईज-दंजन आपकी टिप्पणी "आर्क स्वामित्व अधिकार नहीं बदलता है"। आप निश्चित रूप से सही हैं, लेकिन मैं तर्क दे सकता हूं कि एआरसी वास्तविक स्वामित्व अधिकारों को औपचारिक रूप से औपचारिक रूप से लागू करता है (जब स्वामित्व स्थानांतरित किया जाता है और जब यह नहीं होता है, अर्थात् उपसर्ग 'आवंटन' की उपस्थिति या अनुपस्थिति, 'नया' , 'प्रतिलिपि', या 'mutableCopy'।) – Rob

उत्तर

43
  1. जो एक वस्तु "मालिक" के शैक्षणिक सवाल के संदर्भ में, यह बस जिसे उस वस्तु के लिए एक strong संदर्भ बनाए रखता है।

  2. अपने ऐप में लीक ढूंढने के मामले में, आप ऐप को प्रोफ़ाइल करते समय "लीक" टूल का उपयोग कर सकते हैं (एक्सकोड के "उत्पाद" मेनू पर "प्रोफ़ाइल" चुनें)।

  3. यदि यह "लीक्स" में दिखाई नहीं दे रहा है, हालांकि, ऐसा लगता है कि यह आपके लिए ऐसा लगता है कि यह एक मजबूत संदर्भ चक्र है (जिसे पहले एक बनाए रखने चक्र के रूप में जाना जाता है), कुछ सरल तर्क त्रुटि (उदाहरण के लिए कुछ परिपत्र संदर्भ देखें नियंत्रकों, बड़ी वस्तुओं को कैशिंग, आदि) या कुछ कोर फाउंडेशन से संबंधित समस्या (एआरसी स्वामित्व नहीं लेता है जब तक आप CFBridgingRelease() या __bridge_transfer का उपयोग करने के बारे में सावधान नहीं हैं)।

  4. उपकरण का उपयोग कर आवंटन का स्रोत खोजने के लिए के संदर्भ में, दो चाल मेरी मदद है कि सबसे अधिक कर रहे हैं:

    • अपने माउस (Xcode संस्करणों में साथ खींचें में क्लिक करें पहले से 6, आपके पास विकल्प कुंजी को रखने के दौरान, टाइमलाइन के एक हिस्से को हाइलाइट करने के लिए, जिसे आप जांचना चाहते हैं उसे पहचानने के लिए। आप शायद आवंटन में अपनी एक स्पाइक्स पर ध्यान केंद्रित करना चाहते हैं। उदाहरण के लिए, मैं अपने आवंटन में एक टक्कर मिल गया है और (यह एक ludicrously सरल उदाहरण है जहाँ मैं viewDidLoad में एक विशाल सरणी बनाने था, लेकिन उम्मीद है कि यह आप के विचार दे) इस तरह के रूप में यह प्रकाश डाला:

    enter image description here

    • जब आप कॉल पेड़ का निरीक्षण करते हैं, तो अक्सर आपके कोड पर ध्यान केंद्रित करने के लिए "सिस्टम लाइब्रेरीज़ छुपाएं" चुनने के लिए उपयोगी होता है।

    enter image description here

    फिर आप कर सकते हैं: और अगर आप उपकरण में विधि नाम पर डबल क्लिक करें (मेरे उदाहरण में, यहाँ है, यह viewDidLoad होगा), उपकरण तो आप अपने कोड है कि आवंटन कर रहा है दिखाएगा प्रासंगिक विधि सूची पर डबल क्लिक करें और यह आपको उस कोड पर ले जाएगा जो आवंटन करता है।

    enter image description here

हालांकि यह नहीं दिखाती है तुम थे रिसाव हुआ था (यानी जहां मजबूत संदर्भ चक्र या जहाँ आप इसे जारी करने में विफल रहा है), लेकिन विश्लेषण इस तरह की अक्सर आप ट्रैक कर सकते हैं नीचे जहां लीक ऑब्जेक्ट को तुरंत चालू किया गया था, जो समस्या को ट्रैक करने का पहला कदम है।


तुम सच में यह पता लगाने चाहिए जो एक वस्तु "मालिक" (यानी जहां किसी चीज़ के मजबूत संदर्भ (या बरकरार रखती है) हुआ), Xcode 8 एक नई वस्तु ग्राफ सुविधा है। तो ऐप डीबग करें और फिर डीबग बार में "डीबग मेमोरी ग्राफ" आइकन टैप करें (नीचे लाल रंग में)। एक बार जब आप यह है कि आप बाईं तरफ के किसी ऑब्जेक्ट का चयन कर सकते हैं और आप वस्तु ग्राफ उस वस्तु पर स्वामित्व का दावा है पता चलता देख सकते हैं कार्य करें:

enter image description here

ऊपर दिखाता चुने गए छवि दोनों से मजबूत संदर्भ है कि UIImageView जिसमें इसे प्रस्तुत किया गया है, लेकिन व्यू कंट्रोलर भी एक मजबूत संदर्भ बनाए रखता है।

पहले एक्सकोड संस्करणों में, ऐप को इंस्ट्रूमेंट्स के माध्यम से चलाने के लिए प्रोफाइल करें और "रिकॉर्ड संदर्भ संख्या" विकल्प का चयन करें।

enter image description here

Xcode 5 में और इससे पहले, आप आवंटन उपकरण के लिए i जानकारी बटन पर क्लिक करें के बगल में देखने के लिए: Xcode 6 में, यह "रिकार्ड सेटिंग्स" सही सबसे पैनल में टैब पर स्थित है इस "रिकार्ड संदर्भ मायने रखता है" विकल्प:

enter image description here

वैसे भी, आप तो वस्तु के बगल में दायाँ तीर arrow पर क्लिक करके आवंटन सारांश पर जा सकते हैं, कुछ उद्देश्य यह है कि जारी नहीं किया गया में और गहराई पर (पता लगाने और ऑब्जेक्ट करते समय पता करें आवंटन उपकरण में), और फिर ऊपर दिखाए गए अनुसार, आप वस्तु के लिए बनाए रखने और रिलीज़ की सूची देखेंगे। लेकिन यदि आप ऐप प्रोफाइलिंग से पहले "रिकॉर्ड संदर्भ संख्या" चुनते हैं तो यह केवल तभी कब्जा कर लिया जाएगा।

इस तरह की रखरखाव की गणना को ट्रैक करने में उपयोग करने में कुछ समय लगता है, लेकिन यदि आपको पूरी तरह से यह जानने की आवश्यकता है कि मजबूत संदर्भ कहां स्थापित किए गए थे, तो "रिकॉर्ड संदर्भ संख्या" विकल्प आपकी मदद कर सकता है।

+0

स्पष्टीकरण के लिए धन्यवाद, उन संकेतों के साथ मैं जो समस्या सोचता हूं उसे कम कर सकता हूं। समस्याग्रस्त व्यवहार अभी तक मुझे स्पष्ट नहीं है, लेकिन मैं उस के लिए एक नया प्रश्न खोलूंगा क्योंकि यह अब और अधिक विशिष्ट है। –

+0

@TorstenMohr उत्कृष्ट। मैं आपके अनुवर्ती प्रश्न के लिए अपनी नजर रखूंगा (या बेहतर, मुझे उम्मीद है कि आप इसे हल करेंगे!)। और मेरे जवाब को स्वीकार करने के लिए धन्यवाद। – Rob

+1

समस्या किसी अन्य धागे में आवंटित वस्तुओं से संबंधित थी और मैंने @autoreleasepool का उपयोग नहीं किया था, यह उतना ही आसान है। –

संबंधित मुद्दे