2014-10-20 27 views
5

Diğer StackOverflow Sorularını ve Yanıtlarını okudum ve bunun iOS6'dan beri bir hata olduğunu (veya tasarımla, delege dağıtmak zorunda kaldıktan sonra görüntüleyen, kim bilir). Neden ya da nasıl düzeltilmediğini bilmiyorum.MapKit'teki Bellek Sızıntısı iOS8

Anywho, ben (gelecek okuyucular için, aşağıda) diğer cevaplar sıcak düzeltmeleri ekledik:

- (void) viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [self applyMapViewMemoryHotFixOnDisappear]; 
} 

- (void)applyMapViewMemoryHotFixOnDisappear{ 
    [self applyMapViewMemoryHotFix]; 
    self.mapView.showsUserLocation = NO; 
    self.mapView.delegate = nil; 
    self.locationManager.delegate = nil; 
    [self.mapView removeFromSuperview]; 
    self.mapView = nil; 
} 

- (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]; 
} 

Ancak, ben, neden hafıza MapKit seviyelerine önce çökmez edilir gereken soru ?

Memory Usage Before/After MapKit

Kaçırdığım başka bir şey var mı? Bu beklenen davranış mı? Profiler tarafından yargılanan bir bellek sızıntısı yok, ama belli ki bir şey doğru değil ...

+0

Aynı bakınız);

siz düzeltin ve öldürürsün, hem de gelecekte ürününüzü tehlikeye düşürecek Güçlü Referans Bisikletlere projenizi kontrol edebilirsiniz Umut. Herhangi bir çözüm bulundu? – thejaz

+1

Hayır!Dürüst olmak gerekirse, bölgedeki 'düzeltmeyi' bile değiştirmeyin. 'Bellek sızıntısı' (eğer bu bile olsa), gerçek bir cihazda iyi ve farkedilemez, ve güzel olanı da büyütmez. – SparkyRobinson

+1

Kabul ediyorum, cihazda simülatörden çok daha iyi olduğunu fark ettim. – thejaz

cevap

1

Bu sorunla ilgili olarak SO topluluğu tarafından çok sevilen MemoryHotFix'in kullanımına rağmen, herhangi bir güçlü referans. Başkalarının da söylediği gibi, görüntü denetleyicisine bir referans tutan ve bu görünüm için bir referans olarak aynı görüntü denetleyicisini tutan görünümler kullanıyorsanız (bir örnek okuyorsanız) Güçlü Başvuru Döngüsü'ne girebilirsiniz.

Böyle bir durum, temizlemelerinizi gereksiz ve işe yaramaz hale getiren deinit/dealloc yöntemlerinizi engelleyebilir. documentation belirtildiği üzere

:

yerine güçlü referansların zayıf ya da sahipsiz referans olarak sınıflar arasındaki ilişkilerin bazı tanımlayarak güçlü başvuru çevreleri çözmek. senin deinit (swift)/dealloc aslında çağrılan, (değilse, o Güçlü Referans Döngüsü gösterebilir)

  1. kontrol edin:

Yani emin olun.

  • Aslında MKMapView ve LocalitionManager delegelerinin yanı sıra kendileri de yok. Bunun gibi
  • :

    self.mapView.delegate = nil 
    self.mapView = nil 
    self.locationManager?.delegate = nil 
    self.locationManager = nil 
    

    Kanıtı

    akılda, burada MKMapView başka VC iterek bir VC orada bir örnek olduğunu olması, her dikey kırmızı çizgi "anlamına yeni VC itme "haşhaş" ve her yeşil çizgi anlamına gelen":

    enter image description here

    Bazı başlangıç ​​ayarları var (50 Mb +/- ile başlayan), ancak gelecekteki itme, gösterilen şekilde bellek sızıntısına neden olmaz. Bunun gerçek bir cihaz kullanarak yakalandığını belirtmek gerekir. Ben de simülatörü kullanarak test ettik ve ilk kurulum çok daha yüksek olmasına rağmen (100 Mb'den başlayarak) sonuçlar coerenttir.