Pracuji na iPhone hra, která používá MKMapView jako hrací plochy. Již po několika minutách hry aplikace nevyhnutelně začíná být pomalý a nakonec dojde k chybě z důvodu nedostatku paměti. Po kopání kolem viník se zdá být to, že zobrazení mapy neustále vyžaduje více paměti. Hra vyžaduje hodně zoomování a posouvání mapy, takže mohu jen předpokládat, že mezipaměť mapou je tašek jen stále roste, až se spustí nedostatek paměti. Existuje nějaký způsob, jak přinutit zobrazení mapy na spláchnutí je vyrovnávací paměť dlaždic nebo obsahují to je spotřeba paměti?
Cache Clear MKMapView své dlaždic?
* Poznámka: Tato odpověď je relevantní pouze pro iOS 4.1 a nižší. Problémy popsané v této odpovědi byly většinou stanoveny v iOS 4.2 *
Byl jsem dělat nějaké kopání na to, jak má aplikace využívá i mapy a má také další funkce, které vyžadují vysokou RAM.
Nenašel jsem odpověď, ale alternativní řešení. paměťové nároky MKMapView to stupňovat exponenciálně, jak si přiblížit blíže k oblasti, a posouvat v rámci které přiblížení oblasti.
K dispozici jsou dvě úrovně dlaždice mezipaměti MKMapView. Jeden projevuje jako Malloc ~ 196kb v přístrojích, druhý NSData (sklad) různých velikostí.
Malloc se zdá být aktivní dlaždice jsou již v užívání, a tam je pevný limit na to, kolik může být přidělena. V mé aplikaci, která je číslo 16, není si jistý, jestli jeho základě velikosti UIView či nikoli. Tyto příděly se zdají být přísně řízeny, a reaguje na varování paměti.
Mimochodem, na určité úrovni přiblížení, řekněme na úrovni kontinentu (stačí, aby se vešly většina Severní Ameriky v obrazovce iPadu), vzhledem k velikosti dlaždic, pokud nikdy se musí dostat k té druhé úrovně cache (NSData (Store) ) za účelem doplnění mapy. Vše je svěží a čisté. Kdybych načte tuny externích obrázků do aktivní paměti, dlaždice prořezávat sebe. Úžasný!
Problém nastává, když to udeří, že druhý stupeň ukládání do mezipaměti. To se stane, když se přiblížíte, a najednou namísto 16 dlaždic pro zobrazení celého Planat, že potřebuje 16 dlaždice jen předvést Los Angelas a jak posouvat namísto pouhého dumping ty staré dlaždice klade je do NSData (obchodě ) alokace, kde se zdá, že nikdy uvolněno.
Tento NSData (obchod) je NSURLConnectionCache která existuje ve výchozím nastavení pouze v paměti. Nelze získat přístup k této mezipaměti jej omezit, protože to není výchozí sdílené mezipaměti (už to zkusil).
Tak tohle je místo, kde jsem uvíznou.
Neuspokojující Odpovědí je, že pokud zakážete mapa zvětšování a připevněte ji na dostatečně širokém úrovni přiblížení, můžete tento problém zcela vyhnout, ale samozřejmě některé aplikace potřebovat ... a to je tak daleko, jak jsem se dostal.
podal jsem lístek podpory Apple aby zjistili, zda mohou prozradit nějaký způsob, jak omezit tuto směšnou mezipaměti mapy (což mimochodem jsem byl schopen nenuceně nahodit do více než 50 MB paměti alokovaných v aktivní paměti).
Snad to pomůže.
Upravit
Objeví se další iOS uvolnění do vyřešili tento problém neomezenou mezipaměti. MKMapView nyní agresivně osekává své dlaždice cache data. Radujte se!
Jste nastavení identifikátoru opětovného použití na vaše názory anotace? (To znamená, že systém může uvolnit tyto názory a jen udržet malý počet zobrazení v paměti najednou. To také zvyšuje výkon rolování, protože rolování bude znovu použít odpojené zobrazení.)
Tuto metodu lze použít k získání pohled poznámky k dalšímu použití:
- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier
Pokud vytvoříte aplikaci, s pouhým mapkit a velikostí Vzhledem k 768x1024 (velikost iPad), aplikace mohou klidně zabrat více než 30 + MB „live bajty“, jak uvádí programu Instruments přídělů. To byl zaznamenán běží na v3.2.2 iPad s iOS (nejnovější verze až příští týdny předpokládaných 4,2 uvolňování). Z mého výzkumu se zdá, že toto množství paměti je hodně pro jednu aplikaci, kde hlásit většina vývojářů obdrží úrovně 1 paměti varování kolem 15-25 MB a narazí brzy po této úrovni.













