2009-11-14 18 views
9

मैंने कोर डेटा दस्तावेज़ों में मेमोरी प्रबंधन अनुभाग पढ़े हैं और मैं अभी भी थोड़ा उलझन में हूं। मेरे ऐप में मेरा एक संदर्भ है, और मेरे पास ऑब्जेक्ट्स से बाहर निकलने वाली कई चीजें हैं। उदाहरण के लिए कुछ प्राप्त परिणाम नियंत्रक, विस्तार दृश्य और कुछ अन्य कोड यादृच्छिक वस्तुओं को लाते हैं। एक बार वस्तुओं को पूरी तरह से जारी कर दिया गया है और उनकी बरकरार संख्या 0 है, क्या मूल डेटा स्वचालित रूप से सभी ऑब्जेक्ट जानकारी जारी करेगा और उन्हें गलती करेगा?कोर डेटा मेमोरी प्रबंधन

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

बहुत धन्यवाद,

माइक

उत्तर

12

कोर डाटा वस्तु उसी तरह कोको के बाकी वस्तु जीवन काल का प्रबंधन करता है जीवन काल का प्रबंधन करता है -[NSObject retain]। डिफ़ॉल्ट रूप से, NSManagedObjectContext उदाहरणों को बरकरार नहीं रखता है, इसलिए उन्हें किसी अन्य मालिक (यानी आपके NSFetchedResultsController उदाहरण या आपके प्रोग्राम में अन्य उदाहरणों) जैसे ही रिलीज़ हो जाते हैं। उन्हें जारी रखें। आप प्रबंधित ऑब्जेक्ट संदर्भ के इस डिफ़ॉल्ट व्यवहार को बनाए रखने के लिए बदल सकते हैं उदाहरण, लेकिन आप शायद ही कभी चाहते हैं। प्रबंधित ऑब्जेक्ट संदर्भ में है जो अगले सहेजने तक अपडेट किए गए उदाहरणों को बनाए रखने के लिए है। इन परिवर्तनों को संरक्षित करने का कोई तरीका नहीं है ऑब्जेक्ट इंस्टेंस जब तक संदर्भ सहेजा नहीं जाता है। इसलिए, कोर डेटा ऑब्जेक्ट्स के मेमोरी उपयोग को कम करने के लिए, मानक नियमों का पालन करें: जितनी जल्दी हो सके उन्हें छोड़ दें। यदि आपको लगता है कि आपका संदर्भ स्मृति उपयोग बढ़ रहा है (इसे ट्रैक करने के लिए उपकरण के कोर डेटा उपकरणों का उपयोग करें), यदि आप उदाहरण अपडेट कर रहे हैं तो संदर्भ को और अधिक बार सहेजें और इसलिए अगली सहेजने तक संदर्भ में उन्हें जीवित रखें, भले ही आपने अन्यथा उन्हें जारी किया।

NSFetchedResultsController का उपयोग करना यह सब आसान बनाता है। वास्तव में, कारण NSFetchedResultsController प्रोग्रामर के लिए कम स्मृति वातावरण (जैसे आईफोन) में बैच लाने के लिए बिल्कुल मौजूद है।

जैसा कि लुई ने उल्लेख किया है, NSPersistentStoreCoordinator किसी ऑब्जेक्ट को प्रबंधित ऑब्जेक्ट संदर्भ में गलती होने पर डिस्क पर वापस जाने के बजाय स्मृति में उदाहरण डेटा कैश करने के लिए एक पंक्ति कैश बनाए रखता है। यह एक कोर डेटा कार्यान्वयन विवरण है, हालांकि (हालांकि कैश मिस एक प्रदर्शन हिट हैं; आप उपकरण में कैश मिस ट्रैक कर सकते हैं)। कोर डेटा कैश मेमोरी का प्रबंधन करता है और आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

4

हाँ, CoreData चीजें वापस है कि आप प्रयोग नहीं कर रहे गलती होगी। इसमें कैश और कई अन्य चीजें हैं, इसलिए डेटा तुरंत जारी नहीं किया जा सकता है, लेकिन आम तौर पर यह स्मृति प्रबंधन के बारे में बहुत अच्छा है और जितना संभव हो सके अपने पदचिह्न को रखने के साथ काम करता है।

यदि आपके पास विशेष रूप से अजीब उपयोग प्रोफ़ाइल है, तो आप स्पष्ट रूप से वस्तुओं को दोषों में मजबूर कर सकते हैं, लेकिन आम तौर पर यह आवश्यक नहीं है, और मैं तब तक ऐसा नहीं मानूंगा जब तक कि वास्तव में कुछ वास्तविक प्रोफाइलिंग डेटा न हो, क्योंकि मैं स्मृति दबाव में था। NSManagedObject उदाहरणों एक प्रबंधित वस्तु के संदर्भ में प्रबंधित वस्तु संदर्भ या किसी अन्य वस्तु (के माध्यम से उनमें से स्वामित्व को बरकरार रखे हुए है जब तक स्मृति में रखा जाता है:

+0

धन्यवाद, मैं बस यह सुनिश्चित करना चाहता था कि लम्बे समय तक स्क्रॉल करने के बाद प्राप्त परिणाम नियंत्रक लोड और लोड ऑब्जेक्ट्स को स्मृति में रखने के लिए नहीं जा रहा था और फिर जब तक संदर्भ सहेजा या रद्द नहीं किया जाता तब तक वे वहां रहेंगे! –

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