जो एक वस्तु "मालिक" के शैक्षणिक सवाल के संदर्भ में, यह बस जिसे उस वस्तु के लिए एक strong
संदर्भ बनाए रखता है।
अपने ऐप में लीक ढूंढने के मामले में, आप ऐप को प्रोफ़ाइल करते समय "लीक" टूल का उपयोग कर सकते हैं (एक्सकोड के "उत्पाद" मेनू पर "प्रोफ़ाइल" चुनें)।
यदि यह "लीक्स" में दिखाई नहीं दे रहा है, हालांकि, ऐसा लगता है कि यह आपके लिए ऐसा लगता है कि यह एक मजबूत संदर्भ चक्र है (जिसे पहले एक बनाए रखने चक्र के रूप में जाना जाता है), कुछ सरल तर्क त्रुटि (उदाहरण के लिए कुछ परिपत्र संदर्भ देखें नियंत्रकों, बड़ी वस्तुओं को कैशिंग, आदि) या कुछ कोर फाउंडेशन से संबंधित समस्या (एआरसी स्वामित्व नहीं लेता है जब तक आप CFBridgingRelease()
या __bridge_transfer
का उपयोग करने के बारे में सावधान नहीं हैं)।
उपकरण का उपयोग कर आवंटन का स्रोत खोजने के लिए के संदर्भ में, दो चाल मेरी मदद है कि सबसे अधिक कर रहे हैं:
- अपने माउस (Xcode संस्करणों में साथ खींचें में क्लिक करें पहले से 6, आपके पास विकल्प कुंजी को रखने के दौरान, टाइमलाइन के एक हिस्से को हाइलाइट करने के लिए, जिसे आप जांचना चाहते हैं उसे पहचानने के लिए। आप शायद आवंटन में अपनी एक स्पाइक्स पर ध्यान केंद्रित करना चाहते हैं। उदाहरण के लिए, मैं अपने आवंटन में एक टक्कर मिल गया है और (यह एक ludicrously सरल उदाहरण है जहाँ मैं
viewDidLoad
में एक विशाल सरणी बनाने था, लेकिन उम्मीद है कि यह आप के विचार दे) इस तरह के रूप में यह प्रकाश डाला:
- जब आप कॉल पेड़ का निरीक्षण करते हैं, तो अक्सर आपके कोड पर ध्यान केंद्रित करने के लिए "सिस्टम लाइब्रेरीज़ छुपाएं" चुनने के लिए उपयोगी होता है।
फिर आप कर सकते हैं: और अगर आप उपकरण में विधि नाम पर डबल क्लिक करें (मेरे उदाहरण में, यहाँ है, यह viewDidLoad
होगा), उपकरण तो आप अपने कोड है कि आवंटन कर रहा है दिखाएगा प्रासंगिक विधि सूची पर डबल क्लिक करें और यह आपको उस कोड पर ले जाएगा जो आवंटन करता है।
हालांकि यह नहीं दिखाती है तुम थे रिसाव हुआ था (यानी जहां मजबूत संदर्भ चक्र या जहाँ आप इसे जारी करने में विफल रहा है), लेकिन विश्लेषण इस तरह की अक्सर आप ट्रैक कर सकते हैं नीचे जहां लीक ऑब्जेक्ट को तुरंत चालू किया गया था, जो समस्या को ट्रैक करने का पहला कदम है।
तुम सच में यह पता लगाने चाहिए जो एक वस्तु "मालिक" (यानी जहां किसी चीज़ के मजबूत संदर्भ (या बरकरार रखती है) हुआ), Xcode 8 एक नई वस्तु ग्राफ सुविधा है। तो ऐप डीबग करें और फिर डीबग बार में "डीबग मेमोरी ग्राफ" आइकन टैप करें (नीचे लाल रंग में)। एक बार जब आप यह है कि आप बाईं तरफ के किसी ऑब्जेक्ट का चयन कर सकते हैं और आप वस्तु ग्राफ उस वस्तु पर स्वामित्व का दावा है पता चलता देख सकते हैं कार्य करें:
ऊपर दिखाता चुने गए छवि दोनों से मजबूत संदर्भ है कि UIImageView
जिसमें इसे प्रस्तुत किया गया है, लेकिन व्यू कंट्रोलर भी एक मजबूत संदर्भ बनाए रखता है।
पहले एक्सकोड संस्करणों में, ऐप को इंस्ट्रूमेंट्स के माध्यम से चलाने के लिए प्रोफाइल करें और "रिकॉर्ड संदर्भ संख्या" विकल्प का चयन करें।
Xcode 5 में और इससे पहले, आप आवंटन उपकरण के लिए जानकारी बटन पर क्लिक करें के बगल में देखने के लिए: Xcode 6 में, यह "रिकार्ड सेटिंग्स" सही सबसे पैनल में टैब पर स्थित है इस "रिकार्ड संदर्भ मायने रखता है" विकल्प:
वैसे भी, आप तो वस्तु के बगल में दायाँ तीर पर क्लिक करके आवंटन सारांश पर जा सकते हैं, कुछ उद्देश्य यह है कि जारी नहीं किया गया में और गहराई पर (पता लगाने और ऑब्जेक्ट करते समय पता करें आवंटन उपकरण में), और फिर ऊपर दिखाए गए अनुसार, आप वस्तु के लिए बनाए रखने और रिलीज़ की सूची देखेंगे। लेकिन यदि आप ऐप प्रोफाइलिंग से पहले "रिकॉर्ड संदर्भ संख्या" चुनते हैं तो यह केवल तभी कब्जा कर लिया जाएगा।
इस तरह की रखरखाव की गणना को ट्रैक करने में उपयोग करने में कुछ समय लगता है, लेकिन यदि आपको पूरी तरह से यह जानने की आवश्यकता है कि मजबूत संदर्भ कहां स्थापित किए गए थे, तो "रिकॉर्ड संदर्भ संख्या" विकल्प आपकी मदद कर सकता है।
गैर एआरसी के समान, आर्क मालिक के अधिकारों को बदलता नहीं है –
हाथ में समस्या को वापस लेना: क्या आप हमें अपने कोड के बारे में और बता सकते हैं? क्या आप CoreFoundation ऑब्जेक्ट्स पर कॉल कर रहे हैं? क्या आप उन लाइनों की आपूर्ति कर सकते हैं जहां आपको लगता है कि कुछ लीक हो रहा है? नमूना कोड यहां सहायक होगा, मुझे लगता है। – lxt
@ दाईज-दंजन आपकी टिप्पणी "आर्क स्वामित्व अधिकार नहीं बदलता है"। आप निश्चित रूप से सही हैं, लेकिन मैं तर्क दे सकता हूं कि एआरसी वास्तविक स्वामित्व अधिकारों को औपचारिक रूप से औपचारिक रूप से लागू करता है (जब स्वामित्व स्थानांतरित किया जाता है और जब यह नहीं होता है, अर्थात् उपसर्ग 'आवंटन' की उपस्थिति या अनुपस्थिति, 'नया' , 'प्रतिलिपि', या 'mutableCopy'।) – Rob