2012-09-28 26 views
52

क्या कोई और, जो अपने आईओएस 6 ऐप्स में नक्शे का उपयोग कर रहा है, ऐप को दुर्घटनाग्रस्त करने के बिंदु पर स्मृति चेतावनियां प्राप्त करने के बिंदु पर अत्यधिक उच्च स्मृति उपयोग को देखते हुए?आईओएस 6 एमकेमैपव्यू ऐप को दुर्घटनाग्रस्त करने के बिंदु पर स्मृति के एक टन का उपयोग करके, किसी और को यह नोटिस?

मैं उपकरणों के माध्यम से एप्लिकेशन भाग गया है और मैं किसी भी लीक नहीं दिखाई दे रही है और जब तक मानचित्र दृश्य एप्लिकेशन बनाई गई है लगातार चारों ओर ~ 3mb लाइव बाइट्स पर चलाता है। एक बार नक्शा बनने के बाद और टाइल्स डाउनलोड हो जाते हैं, लाइव बाइट्स ~ 13 एमबी लाइव बाइट तक कूद जाता है। फिर जब तक मैं मानचित्र को चारों ओर ले जाता हूं और लाइव बाइट्स निरंतरों को ज़ूम इन करता हूं और तब तक चढ़ता हूं जब तक कि ऐप लगभग ~ 40 एमबी लाइव बाइट्स पर क्रैश न हो जाए। यह एक आईफोन 4 पर है। एक आइपॉड स्पर्श पर यह पहले भी दुर्घटनाग्रस्त हो जाता है।

मैं एनोटेशन विचारों का सही उपयोग कर रहा हूं और कुछ भी लीक नहीं हो रहा है। क्या कोई अन्य आईओएस 6 मैप्स के साथ इस उच्च स्मृति उपयोग को देख रहा है? इसके अलावा, क्या किसी के पास कोई समाधान है?

+0

मैंने एक न्यूनतम परीक्षण ऐप बनाया है जिसमें 'MKMapView' ड्रैग एन' से अधिक कुछ भी नहीं है और 50-90 एमबी * लाइव बाइट्स * (आईफोन 5 सिम्युलेटर) के आदेश पर देखें। इसी तरह अन्य हार्डवेयर अनुकरण के साथ उच्च लाइव बाइट्स। तो यह निश्चित रूप से पुस्तकालय के साथ एक मुद्दा यह प्रतीत होता है। http://stackoverflow.com/questions/13340999/guide-to- अस्वीकार्य- लाइव-bytes-of-ios6-app-using-mkmapview –

उत्तर

23

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

  • इसके बजाय बनाने की

    नई MKMapView के रूप में अनुप्रयोग में की जरूरत है, मैं अपने AppDelegate के लिए एक MKMapView संपत्ति जोड़ा गया है और केवल यह बनाया जब जरूरत। एक बार यह बनाया गया है, यह हमेशा के लिए AppDelegate में रहता है और मैं हर जगह उस एकल घटना का पुन: उपयोग करता हूं। इससे वास्तव में उपयोग की जा रही मेमोरी की मात्रा को कम करने में मदद मिली क्योंकि मैं पहले कुछ अलग एमकेमैप व्यू को तुरंत चालू कर रहा था और दोनों मेमोरी के माध्यम से बहुत जल्दी जल रहे थे।

  • मैंने यह भी पाया कि आईओएस 6 मैप्स मेमोरी चेतावनी प्राप्त होने के बाद स्मृति को बहुत अच्छी तरह से रिलीज करता है। हां, ज़ूमिंग और पैनिंग करते समय यह अधिक मेमोरी का उपयोग करता है, लेकिन मेमोरी चेतावनी उचित रूप से प्रतिक्रिया दे रहा है।

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

+0

यदि मेरे पास 'UITabBarController' की स्क्रीन में से एक के रूप में एक स्टोरीबोर्ड में मेरा 'MKMapView' सेटअप है, तो आप इसे AppDelegate में रखने के बारे में कैसे जाएंगे? क्या अभी भी स्टोरीबोर्ड का उपयोग करने का कोई तरीका है, या क्या इसे वहां से हटाना है और फिर इसे प्रोग्रामेटिक रूप से जोड़ना है? तो आवंटन के साथ, इसकी फ्रेम, इत्यादि सेट? – Joseph

+0

कैस्पर, यदि आपके पास केवल आपके ऐप में एक एमकेमैप व्यू है और आप इसे अपने स्थान पर हमेशा के लिए जीने की अनुमति देते हैं तो इससे कोई फर्क पड़ता है कि आपके पास व्यू कंट्रोलर या ऐप प्रतिनिधि में है या नहीं। बस MKMapView के कई उदाहरण न बनाएं और आपको अच्छा होना चाहिए। क्या आप अपने एक मानचित्र के साथ स्मृति समस्या देख रहे हैं? –

+0

आईपैड सिम्युलेटर में कुछ ज़ूमिंग, पिंचिंग इत्यादि के बाद मेरे आवंटन में 1.84 जीबी (!) हॉट-फिक्स को लागू करने के बाद (मैप टाइप को '- (शून्य) में किया गया था रीसीव मेमरीवार्निंग') यह 200 एमबी कभी नहीं चला। – Joseph

5

मेरा पदचिह्न था: 2.48; 19.51; 49.64; 12.60 जो है: मैप व्यू लोड करने से पहले मेमोरी, व्यू लोड करने के बाद, थोड़ा ज़ूम इन/आउट करने के बाद, और नक्शा व्यू जारी करने के बाद (जो मैप व्यू जारी करने के बाद भी काफी परेशान है, मैं 10 एमबी वृद्धि करता हूं और यह नहीं जाता नीचे!)

वैसे भी, मैं अब और MapView के लिए एक IBOutlet उपयोग नहीं कर रहा है, मैं कोड में सब कुछ के बजाय बनाने रहा हूँ। नया पदचिह्न अब है: 2.48; 19.48; 38.42; 12.54।

अभी भी bi *** नीचे डालने पर काम कर रहा है।

+0

मैं पूरी तरह से आपकी अंतिम टिप्पणी से संबंधित हो सकता हूं – Gmeister4

3

मुझे एक ही भावना है और यह नहीं पता कि release यह memory, यहां तक ​​कि MKMapView का उपयोग नहीं किया जाता है।

मैंने नियंत्रक, MKMapView, कंटेनर व्यू जारी किया है ... memory अभी भी उपयोग किया जाता है।

iOS5 में वर्ष MKMapView के साथ इस अनुभव करने के लिए याद नहीं है।

8

मुझे एक ही समस्या का अनुभव है।

ज़ूम और स्थान बदलने के बाद मेमोरी कभी जारी नहीं की जाती है।

मुझे मिली एकमात्र चाल स्मृति चेतावनी के बाद मानचित्र प्रकार को बदलना है।

5

नहीं एक समाधान लेकिन बस एक चाल ...

... बदल mapType => MapKit रिहाई स्मृति।

भले ही यह परिवर्तन दूसरे के अंश के लिए हो।

21

मुझे यह समस्या भी है और यह मुझे पागल कर रहा है।

- (void)applyMapViewMemoryHotFix{ 

    switch (self.mkMapView.mapType) { 
     case MKMapTypeHybrid: 
     { 
      self.mkMapView.mapType = MKMapTypeStandard; 
     } 

      break; 
     case MKMapTypeStandard: 
     { 
      self.mkMapView.mapType = MKMapTypeHybrid; 
     } 

      break; 
     default: 
      break; 
    } 

    [self.mkMapView removeFromSuperview]; 
    self.mkMapView = nil; 
} 

इम यकीन नहीं क्यों, लेकिन superview से निकालने और उसके बाद शून्य के लिए सेटिंग वास्तव में स्मृति के उपयोग को कम कर देता का संयोजन: Mateo की पोस्ट पर आधारित एक हॉटफिक्स यह पता लगाने की कोशिश कर रहा, यह क्या मैं के साथ आया है। मैं इस विधि को नियंत्रक के दृश्य में कॉल करता हूं DidDisappear।

अन्य चीजें मैंने कोशिश की लेकिन महत्वपूर्ण प्रभाव के बिना:

1) MKMapView

2) के alloc init के आसपास बना रहा autoreleasepool 84 देशांतर अक्षांश के आसपास के क्षेत्र का प्रदर्शन किया सेटिंग -30 के रूप में मैं आर्कटिक में वेक्टर सूचना सोचा शायद घने नहीं हो सकता है ...),

यह समस्या बहुत गंभीर है और हमारे ऐप को अस्थिर होने का कारण बनता है और आईओएस 6 में स्मृति चेतावनियों का कारण बनता है। निश्चित रूप से आशा है कि ऐप्पल मेरे से बेहतर हॉटफिक्स जारी करेगा ... शीघ्र!!

कृपया मेरे हॉटफिक्स की आलोचना करें और मानचित्र को हटाते समय स्मृति उपयोग को कम करने के लिए अधिक प्रभावी तरीकों के साथ आएं। धन्यवाद!

+0

सुपर-उपयोगी खोज, धन्यवाद! बस यह सभी स्मृति को मुक्त करना चाहते हैं। अभी भी मानचित्र-आवंटित स्मृति का एक छोटा हिस्सा छोड़ देता है। – stuckj

+2

मैंने स्विच स्टेटमेंट हटा दिया और आखिरी दो पंक्तियों को छोड़ दिया और ऐसा लगता है कि मेमोरी बहुत अच्छी तरह साफ हो गई है। –

+7

जहां तक ​​मुझे यह फिक्स दिखाई देता है, आईओएस 7 में मदद नहीं करता है। MKMapView बहुत गंभीर मेमोरी लीक का कारण बनता है। – kal21

2

मैं एक ही मुद्दा प्राप्त कर रहा हूँ -

मैं पूरी तरह से इस बारे में यकीन नहीं है, लेकिन यह है कि नए सेब नक्शे प्रीलोड नक्शे का एक विशाल क्षेत्र ऑफ़लाइन नेविगेशन के लिए पूरा करने के लिए हो सकता है?

यदि नक्शा लोड होने के बाद आप अपना कनेक्शन बंद कर देते हैं, तो वांछित स्थान के नजदीक कहीं भी क्षेत्रों पर कोशिश करें और ज़ूम इन करें, फिर भी एक बहुत सारी जानकारी अभी भी उपलब्ध है।

2
- (void)applyMapViewMemoryHotFix{ 

    switch (self.mapView.mapType) { 
     case MKMapTypeHybrid: 
     { 
      self.mapView.mapType = MKMapTypeStandard; 
     } 

      break; 
     case MKMapTypeStandard: 
     { 
      self.mapView.mapType = MKMapTypeHybrid; 
     } 

      break; 
     default: 
      break; 
    } 


    self.mapView.mapType = MKMapTypeStandard; 



} 
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [self applyMapViewMemoryHotFix]; 
} 
+0

यह आईओएस 8.4 के रूप में काम करता है, लेकिन मानचित्र मोड को स्वैप करते समय एक नक्शा झिलमिलाहट देता है जो निश्चित रूप से यूएक्स (उपयोगकर्ता अनुभव) को कम कर देगा। –

1

परिणाम के बारे में सुनिश्चित नहीं हैं।

जब भी गायब हो जाता है, तो 'नील' पर नक्शा कैसे सेट करता है, मुझे स्मृति उपयोग को ~ 250 एमबी से ~ 50-60MB तक कम करने में मदद मिली।

-(void)viewDidDisappear:(BOOL)animated 
{ 
    self.map = nil; 
} 
+0

मैंने यह लाइन भी जोड़कर स्मृति को कम करने में मदद की। [self.map removeFromSuperview]; – Shashi3456643

2

2014+ (iOS8 और ऊपर) में यहां journerying उन मैं 7+ iOS पर इस समस्या में चल रहा पुराने उपकरणों (लगता है 512MB के साथ iPad 2) का समर्थन करने की कोशिश कर के लिए

मेरा समाधान ज़ूम अक्षम करना है क्योंकि यह आसानी से सबसे अधिक स्मृति लेता है।

long mem = [NSProcessInfo processInfo].physicalMemory; 
    if(mem < _memory_threshold){ 
     self.MapView.zoomEnabled = NO; 
    } 

मैं नक्शे प्रकार स्विचिंग, नक्शे deallocating करने से सब कुछ की कोशिश की है, नहीं के बराबर करने के लिए प्रतिनिधि की स्थापना, सभी ओवरले को हटाने, इस बात का एनोटेशन आदि

कोई नहीं पर iOS7 + काम करता है। वास्तव में, इनमें से अधिकतर फ़िक्स मेमोरी में कूदते हैं, क्योंकि एमके मैप व्यू रिसाव लग रहा है और कभी भी ठीक से डीलोक नहीं करता है (मैंने सब-क्लासिंग के माध्यम से सत्यापित किया है जिसे मैं डेलोक हिट देखता हूं)।

यह बेकार है, लेकिन अब तक मैं सभी के साथ आया हूं मैप सुविधाओं (ज़ूम, स्क्रॉल, उपयोगकर्ता इंटरैक्शन) को स्मृति की अत्याचारी राशि को सीमित करने के साधन के रूप में अक्षम करना MKMapView लेता है। इसने मेरे ऐप को पुराने उपकरणों पर कम से कम सेमी-स्थिर होने के परिणामस्वरूप बनाया है।

6

यह समस्या अभी भी आईओएस 9 में मौजूद है - जब तक आप ऐसा नहीं करते।

एक स्टोरी बोर्ड में स्थापित मैप व्यू के साथ व्यू कंट्रोलर से और सेग्यू के कारण 10-15 शो के बाद एक क्रैश (मेरे लिए) का कारण बनता है और चक्रों को खारिज कर देता है।

अब ऐसा लगता है कि फिक्स सरल है। यह

override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    mapView.removeFromSuperview() 
} 

समस्या को ठीक करने के लिए लगता है, चक्र 20 से अधिक बार और उससे अधिक हो सकता है, और कोई समस्या नहीं है। दुर्घटना नहीं!!

उम्मीद है कि इससे मदद मिलती है। यह एक निराशाजनक समस्या थी और इसे सुलझाने में खुशी हुई।

+1

कमाल! हालांकि यह स्पष्ट रूप से ऐप्पल से MKMapView कार्यान्वयन के साथ मुद्दों को इंगित करता है, "removeFromSuperview" को कॉल करने से निश्चित रूप से मेरे लिए यह तय किया जाता है। मेरे पास एक डेटा स्वीकृति ऐप है जहां मैं एक मानचित्र के साथ एक पूर्ण स्क्रीन नियंत्रक के बीच फ़्लिप कर रहा हूं, और स्वीकृति देने के लिए मानचित्रों की एक सूची - अतीत में मैं स्मृति दबाव के कारण क्रैश होने से पहले केवल 7-10 मानचित्रों के माध्यम से प्राप्त कर सकता था। अब मैं हमेशा के लिए जा सकता हूं, और प्रोफाइलर साबित करता है कि यह समाधान काम करता है - रैम का उपयोग लगभग 40 एमबी रहता है, जबकि पहले, यह हर बार लगभग 30-40MB तक बढ़ता है जब मैंने वीसी को उस पर मानचित्र के साथ खोला, तब तक क्रैशिंग-धन्यवाद! आईओएस 9 के लिए – DiscDev

+0

, यह "सही" उत्तर है। – DiscDev

+0

@ डॉगकोफी, उत्कृष्ट उत्तर !!! +1 –