2015-02-20 5 views
5

मैं सलाह this one की तरह, कई अतः सवालों में उपलब्ध का पालन किया है क्रम स्मृति से MKMapView जारी करने के लिए, - नीचेMKMapView रिहाई स्मृति

- (void)viewDidDisappear:(BOOL)animated { 

    [super viewDidDisappear:animated]; 

    self.map.mapType = MKMapTypeHybrid; 
    self.map.showsUserLocation = NO; 
    self.map.delegate = nil; 
    [self.map removeFromSuperview]; 
    self.map = nil; 

    self.locationManager.delegate = nil; 
} 

मेरी कोड भाग में, यह काम करता है, लेकिन पूरी तरह नहीं। मुझे कुछ डेटा प्रदान करने दें।

नीचे उपकरण से स्मृति आवंटन रिकॉर्डिंग है।

enter image description here

दो लाल झंडे (पीढ़ियों) राज्यों से संकेत मिलता है इससे पहले कि मैं एक मॉडल दृश्य नियंत्रक में और बाद मैं इसे ख़ारिज कर दिया है MKMapView का प्रदर्शन किया। MKMapView विलुप्त होने लगता है। उदाहरण के लिए, अगर मैं सांख्यिकी MKMapView के लिए उपकरण में ढेर को फिल्टर, वस्तु वास्तव में जब मोडल दृश्य प्रस्तुत किया है दिखाई देते हैं, और एक बार यह बंद है गायब हो जाता है है। हालांकि, मानचित्र दृश्य को खारिज कर दिया गया है, मेरे पास अभी भी 30+ एमबी मेमोरी है जिसे मुक्त नहीं किया गया है।

पीढ़ी बी (दूसरा लाल झंडा) आंकड़ों से पता चलता है कि वहाँ वस्तुओं (और गैर वस्तुओं) कि इस स्मृति पकड़े हुए हैं की एक बड़ी संख्या है।

enter image description here

जब मैं उन उदाहरणों में से एक की विस्तारित विवरण को देखो, यह आम तौर पर पता चलता है कि निजी कक्षाएं कि, मुझे लगता है सुविधाएँ एक स्टैक ट्रेस, enter image description here

ड्राइंग किसी को भी पता है मैप करने के लिए संबंधित हैं उस डेटा को कैसे मुक्त करें? क्या कोई कैश है जिसे मैं साफ/साफ कर सकता हूं?

+0

क्या आपने इस समस्या को हल करने में कामयाब रहे हैं? – azimov

+0

दुर्भाग्य से, अभी तक नहीं .. – artooras

+0

स्मृति को साफ़ करने में अब कोई भाग्य? – sridvijay

उत्तर

1

मेरे ऐप में, जो एक टैब व्यू कंट्रोलर के नियंत्रण में मैप व्यू कंट्रोलर का उपयोग करता है, मैं एक स्थिर चर में MKMapView का संदर्भ संग्रहीत करता हूं और एक नया नक्शा आवंटित करने के बजाय इस मानचित्र मानचित्र का बार-बार उपयोग करता हूं हर बार ViewDidLoad। मेरे (आंशिक) कोड: self.tabBarController.detailItem के लिए नक्शा

@implementation PubMapViewController { 
    NSMutableArray *annotations; 
} 
static MKMapView *_mapView = nil; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (!_mapView) { 
     _mapView = [[MKMapView alloc] init]; // frame set up with constraints 
    } else { 
     [_mapView removeAnnotations:_mapView.annotations]; // precaution 
    } 
    [_mapViewProxy addSubview:_mapView]; 
    [self addConstraints:_mapView]; 
    [self configureView:((PubTabBarController *)self.tabBarController).detailItem]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [_mapView addAnnotations:annotations]; 
    if (annotations.count == 1) { 
     [_mapView selectAnnotation:annotations[0] animated:YES]; 
    } 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [_mapView removeAnnotations:_mapView.annotations]; 
} 

यहाँ, configureView: सेट, अपने प्रतिनिधि और दुकानों नक्शा एनोटेशन चर annotations में सेट करता है।

नक्शा एक दृश्य इंटरफ़ेस बिल्डर में परिभाषित करने के लिए एक subview (चर उदाहरण @property (weak, nonatomic) IBOutlet UIView *mapViewProxy;) किया जाता है। मानचित्र को mapViewProxy के समान आकार प्राप्त करना होगा, और जैसे ही मैं ऑटोलायआउट का उपयोग करता हूं, _mapView का फ्रेम आकार पूरी तरह से (ऊपर, नीचे, बाएं, और दाएं _mapView.superview के बराबर) में स्थापित बाधाओं का उपयोग करके नियंत्रित किया जाता है।

मुझे viewDidDisppear: में मानचित्र से एनोटेशन को हटाने और उन्हें viewDidAppear में वापस जोड़ने के लिए अनिवार्य पाया गया। यह और भी viewDidDisppear: में _mapView.delegate अनसेट और इसे वापस सेट viewDidAppear में करने के लिए स्वच्छ हो सकता है।

बीटीडब्लू: स्थिर चर _mapView अभी भी भ्रामक रूप से अग्रणी अंडरस्कोर लेता है क्योंकि यह आईबी में MKMapView को परिभाषित करके स्थापित एक उदाहरण चर था।

0

यह समाधान है कि मैं का इस्तेमाल किया है और यह ठीक काम कर रहा है। मुझे लगता है कि यह समस्या हाल ही में पेश की गई थी क्योंकि मुझे उसी परियोजना के भीतर मानचित्र को ठीक से हटाने के साथ कोई समस्या नहीं थी।

मैंने मैप इंस्टेंस को सिंगलटन में संग्रहीत किया और बस एक नया निर्माण करने से पहले इसके अस्तित्व की जांच की। यानी:

if let existingMapView = LocationSingleton.sharedInstance.singletonMapView { 

    //Display map 
}else{ 

    let newMapView = //Instantiate new map view controller 
    LocationSingleton.sharedInstance.singletonMapView = newMapView 

    //Display map 
}