2013-03-15 29 views
6

में मैं एक साधारण UIViewController कि बनाता है और एक GMSMapView नष्ट कर देता है बनाया है।स्मृति रिसाव GMSMapView

- (void)viewDidAppear:(BOOL)animated 
{ 
    if (!m_disappearing_bc_segue) 
    { 
     [super viewDidAppear:animated] ; 

     GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude: self.location.latitude 
                  longitude: self.location.longitude 
                   zoom:9 ] ; 

     m_mapView = [GMSMapView mapWithFrame:CGRectMake(0, 0, 320, 420) camera:camera]; 

     m_mapView.myLocationEnabled = NO ; 

     [m_mapView setMapType: kGMSTypeTerrain] ; 

     m_mapView.delegate = self ; 

     [self.view addSubview:m_mapView] ; 
     [self.view sendSubviewToBack:m_mapView] ; 
} 



- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated] ; 

    [m_mapView clear] ; 
    [m_mapView stopRendering] ; 
    [m_mapView removeFromSuperview] ; 
    m_mapView = nil ; 
} 

मैंने आवंटन उपकरण के साथ उपकरण का उपयोग किया है। परीक्षण आसान है। एक UINavigation ViewController में, दृश्य को दबाएं, वापस हिट करें और दोहराएं। हर बार जब आप ऊपर वर्णित GMSMapView युक्त दृश्य को धक्का देते हैं और पॉप करते हैं तो लगभग 40kb रिसाव होता है। मेरे पास यह चित्रण करने के लिए इंस्ट्रूमेंट्स से एक स्क्रीनशॉट है, लेकिन स्टैक ओवरफ्लो मुझे इसे पोस्ट करने की अनुमति नहीं देता है। यदि दिलचस्पी है तो मैं ईमेल द्वारा किसी को भेज सकता हूं।

मैं कुछ गलत कर या कुछ लाभ नहीं ले पा रहा हूं?

+0

आप हर बार 'पुनः बनाना GMSMapView' आवश्यकता क्यों है? –

+0

m_mapView.delegate = nil जोड़ने का कोई भी मौका; कहने से पहले m_mapView = nil इसे हल करेगा? यह ... –

+0

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

उत्तर

2

क्या मेरे लिए काम किया @try खंड मैं dealloc में था को हटाने गया था:

@try { 
    [self.mapView removeObserver:self forKeyPath:@"myLocation"]; 
} 
@catch (NSException *exception) { 
} 

मेरे इरादे पर्यवेक्षक के रूप में self दूर करने के लिए जब ViewController dealloc'd है (विडंबना यह है कि एक स्मृति समस्या से बचने के लिए) था, और अपवाद को अनदेखा करें यदि यह पर्यवेक्षक नहीं है।

जाहिर @try किसी भी तरह MapView है, जो इसे (एआरसी) के माध्यम से स्मृति में रहने बनाता है बरकरार रखती है। देखें क्यों: Why does "try catch" in Objective-C cause memory leak?

(कुछ ध्वज के साथ और कंडीशनिंग removeObserver अपवाद से बचने के लिए) @try खंड हटाने के बाद, स्मृति सामान्य रूप से व्यवहार करने के लिए वापस चला गया!

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