2015-08-28 12 views
10

क्या मेरे स्विफ्ट कोड में मजबूत संदर्भ चक्रों का पता लगाने के लिए कोई उपकरण या विधि है?स्विफ्ट में मजबूत संदर्भ चक्र की पहचान कैसे कर सकते हैं?

एक मजबूत संदर्भ चक्र कक्षाओं के दो उदाहरणों उचित safeties (weak/unowned) इसलिए एक बार सभी चर मैं उन वस्तुओं को संदर्भित बंद कर दिया बनाया उनमें से निपटाने से कचरा कलेक्टर को रोकने के बिना एक दूसरे को संदर्भ है।

+0

मैं इस पर्यावरण प्रणाली के लिए नया हूं (इसलिए उद्देश्य सी का कोई ज्ञान नहीं), तो, अब से यह एआरसी है। –

+0

यह ठीक है, क्योंकि अवधारणाएं काफी हद तक समान हैं। मैं आश्चर्यचकित हूं कि यदि आप उद्देश्य-सी मजबूत संदर्भ चक्रों में चर्चा देखते हैं और तुरंत इसे अपने स्विफ्ट प्रोग्रामिंग पर लागू नहीं कर पा रहे हैं (esp क्योंकि आप 'अज्ञात' और स्विफ्ट में 'कमजोर' वाक्यविन्यास से परिचित हैं)। – Rob

उत्तर

0

आप ऐसा करने के लिए use Instruments कर सकते हैं। this article के अंतिम पैराग्राफ के रूप में कहा गया है:

एक बार उपकरण को खोलता है, आप अपने आवेदन करने के लिए और कुछ बातचीत करने के क्षेत्रों या दृश्य नियंत्रकों आप परीक्षण करना चाहते में विशेष रूप से करना चाहिए। किसी भी पता चला रिसाव "लीक" खंड में एक लाल रेखा के रूप में दिखाई देगा। सहायक दृश्य में एक ऐसा क्षेत्र शामिल है जहां उपकरण आपको रिसाव में शामिल स्टैक ट्रेस दिखाएंगे, जिससे आपको यह पता चल जाएगा कि समस्या कहां हो सकती है और आपको सीधे अपमानजनक कोड पर नेविगेट करने की अनुमति भी मिलती है।

1

लीक और मेमोरी हानि की जांच के लिए उपकरणों का उपयोग करें। उपकरण पर आवंटन उपकरण में मार्क जनरेशन (हीपशॉट) का प्रयोग करें।

HowTo उपयोग Heapshot स्मृति creap खोजने के लिए के लिए देखें: bbum blog

मूल रूप से विधि, उपकरण उपकरण आवंटित चलाने के लिए, एक heapshot ले अपने कोड का एक यात्रा चलाने के लिए और एक और heapshot दोहरा 3 या 4 बार लेने के लिए है। यह स्मृति को इंगित करेगा जो आवंटन के दौरान आवंटित और जारी नहीं किया गया है।

व्यक्तिगत आवंटन देखने के लिए परिणामों का खुलासा करने के लिए।

तुम कहाँ बरकरार रखे हुए है, विज्ञप्ति और autoreleases एक वस्तु उपयोग उपकरणों के लिए हो देखने के लिए की जरूरत है:

उपकरणों में चलाएँ, पर सेट "रिकार्ड संदर्भ मायने रखता है" आवंटन में (Xcode 5 के लिए और कम आप रिकॉर्डिंग रोकने के लिए विकल्प सेट करने के लिए)। ऐप को चलाने के लिए, रिकॉर्डिंग को रोकें, ड्रिल करें और आप यह देखने में सक्षम होंगे कि सभी बनाए रखने, रिलीज़ और ऑटोरेलीज़ कब हुआ। के रूप में यह ऑब्जेक्टिव-सी में है

+0

पहली वाक्य में देखें: "मार्क जनरेशन"। बीबीएम द्वारा ब्लॉग पोस्ट ने "हीपशॉट" का उपयोग किया, इसलिए मैंने इसमें माता-पिता में शामिल किया: "(हेपशॉट)"। – zaph

11

मजबूत संदर्भ चक्र को खोजने के लिए विधि स्विफ्ट में एक ही है।

आप एक्सकोड से ऐप चलाएंगे, ऐप को चक्र को प्रकट करने के लिए पर्याप्त रूप से व्यायाम करेंगे, और फिर "डीबग मेमोरी ग्राफ" बटन (debug memory graph) पर टैप करें। इसके बाद आप बाईं तरफ के पैनल में एक अप्रकाशित वस्तु का चयन कर सकते हैं और यह आपको स्मृति ग्राफ दिखा देंगे, अक्सर जो कर सकते हैं स्पष्ट रूप से मजबूत संदर्भ चक्र:

debug memory graph

कभी कभी स्मृति चक्र नहीं है कि के रूप में के रूप में स्पष्ट हैं, लेकिन आप कम से कम देख सकते हैं कि ऑब्जेक्ट में प्रश्न के लिए एक मजबूत संदर्भ रखने वाला वस्तु क्या है। यदि आवश्यक हो, तो आप पीछे की तरफ ट्रैक कर सकते हैं और पहचान सकते हैं कि इसके लिए एक मजबूत संदर्भ क्या है, और इसी तरह।

कभी-कभी यह जानना कि किस प्रकार की वस्तु मजबूत संदर्भ को रखती है अपर्याप्त है, और आप वास्तव में जानना चाहते हैं कि आपके कोड में मजबूत संदर्भ स्थापित किया गया था।https://stackoverflow.com/a/30993476/1271826 में दिखाए गए अनुसार "मॉलोक स्टैक" विकल्प का उपयोग यह पता लगाने के लिए किया जा सकता है कि कॉल स्टैक क्या था जब यह मजबूत संदर्भ स्थापित किया गया था (अक्सर आपको कोड की सटीक रेखा की पहचान करने देता है जहां इन मजबूत संदर्भ स्थापित किए गए थे)। अधिक जानकारी के लिए, डब्ल्यूडब्ल्यूडीसी 2016 वीडियो Visual Debugging with Xcode देखें।

आप लीक ऑब्जेक्ट की पहचान करने के लिए उपकरण का भी उपयोग कर सकते हैं। एपोकेशंस टूल के साथ इंस्ट्रूमेंट्स के माध्यम से ऐप चलाएं, बार-बार (केवल एक या दो बार नहीं) ऐप को कुछ स्थिर स्थिति की स्थिति में वापस लौटाएं और यदि स्मृति जारी रहती है, तो आपके पास एक मजबूत संदर्भ चक्र हो सकता है। आप आवंटन उपकरण वस्तुओं किस तरह जारी नहीं किया जा रहा है की पहचान करने की पहचान के लिए ठीक जहां इन मजबूत संदर्भ स्थापित किए गए थे, आदि

WWDC 2013 वीडियो Fixing Memory Issues और WWDC 2012 वीडियो iOS App Performance: Memory देखें सुविधा का उपयोग कर सकते हैं, का उपयोग करें "रिकॉर्ड संदर्भ गिनती" स्मृति मुद्दों की पहचान और समाधान करने के लिए परिचय के लिए। प्रस्तावित बुनियादी तकनीक आज भी लागू हैं (हालांकि उपकरण उपकरण का यूआई थोड़ा बदल गया है ... यदि आप थोड़ा बदलते यूआई के लिए परिचय चाहते हैं, तो डब्ल्यूडब्ल्यूडीसी 2014 वीडियो Improving Your App with Instruments देखें)।

एक तरफ, "कचरा संग्रह" एक बहुत ही अलग स्मृति प्रणाली को संदर्भित करता है और यहां लागू नहीं होता है।

1

बहुत सरल दृष्टिकोण deinitialiser

deinit { 
    print("<yourviewcontroller> destroyed.") 
} 

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

+1

इस दृष्टिकोण के लिए मैं एक मैनुअल "बाइनरी खोज" जोड़ूंगा: कोड के पूरे भाग को अक्षम करें, और सुनिश्चित करें कि डेनिट कहा जाता है। कोड का आधा पुन: सक्षम करें, और जांचें कि क्या डेनिट अभी भी बुलाया गया है या यदि यह नहीं है। रिकर्स;) – endavid

+0

स्विफ्ट में, क्योंकि इनलाइन क्लोजर बनाना इतना आसान है, उनके अंदर संदर्भ चक्र बनाने की भी उच्च संभावना है। कोड में किसी भी बंद करने के लिए नजर रखें। सुरक्षित होने के लिए, मैं आमतौर पर एक [कमजोर स्व] गार्ड के साथ अपने बंद होने शुरू करता हूं कमजोर स्वयं = स्वयं और {वापसी}। Https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID48 पढ़ें – endavid

16

आप अपनी कक्षाओं में डेनिट फ़ंक्शंस जोड़ सकते हैं जिन्हें आपकी ऑब्जेक्ट्स को हटाए जाने पर बुलाया जाएगा।

यदि आपका ऐप चल रहा है, तो डीनिट नहीं बुलाया जा रहा है, तो आप डीबग मेमोरी ग्राफ बटन (नीचे घूमते हुए) दबा सकते हैं और इसका निरीक्षण कर सकते हैं कि इसका क्या संदर्भ है।

Debug Memory Graph Button

उपयोग मध्य फलक के शीर्ष पर ड्रॉपडाउन मेनू वर्गों और वर्गों के उदाहरण के बीच टॉगल करने।

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

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