IOS6 MKMapView с использованием тонны памяти, вплоть до сбоя приложения, кто-нибудь еще заметил это?
Кто-нибудь еще, кто использует карты в своих приложениях для iOS 6, замечает чрезвычайно высокую память, с точки зрения получения предупреждений о памяти снова и снова до точки сбой приложения?
Я запускаю приложение с помощью инструментов, и я не вижу никаких утечек и пока не будет создано представление карты, приложение будет последовательно работать около ~ 3 МБ Live Bytes. После создания карты и загрузки фрагментов Live Bytes перескакивает до ~ 13 МБ Live Bytes. Затем, когда я перемещаю карту вокруг и увеличиваю и увеличиваю непрерывность живых байтов, чтобы подняться, пока приложение не сработает около ~ 40 МБ Live Bytes. Кстати, это на iPhone 4. На iPod touch он падает еще раньше.
Я правильно использую аннотации и ничего не просачивается. Кто-нибудь еще видит такое же высокое использование памяти с новыми картами iOS 6? Кроме того, есть ли у кого-нибудь решение?
Ответы
Ответ 1
После многих игр и тестирования различных идей, некоторые из которых были упомянуты здесь, окончательное решение, которое сработало для меня, было следующим.
-
Вместо того, чтобы создавать новый MKMapView по мере необходимости в приложении, я добавил свойство mkMapView в свой AppDelegate и создавал его только тогда, когда это необходимо. После того, как он был создан, он навсегда останется в AppDelegate, и я снова использую этот единый экземпляр везде, где это необходимо. Это действительно помогло уменьшить объем используемой памяти, поскольку я ранее создавал пару разных MKMapView, и оба быстро сжигали память.
-
Я также обнаружил, что карты iOS 6 Maps очень хорошо освобождают память после получения предупреждения о памяти. Да, он использует больше памяти во время масштабирования и панорамирования, но, похоже, правильно реагирует на предупреждения памяти.
-
Последнее, что мне нужно было сделать, - это работа по сокращению моего первоначального объема памяти. Я заметил, что начинаю путь выше, чем я ожидал, что также способствовало сбоям, которые я получал, связанным с памятью. После того, как я получил первоначальный снимок, пусть MKMapView обрабатывает его память во время предупреждений памяти и убедился, что у меня есть только один экземпляр MKMapView, который я могу использовать во всем приложении, все работает нормально.
Ответ 2
У меня также есть эта проблема, и это сводит меня с ума.
Попытка выяснить, какое исправление основано на публикации mateo, вот что я придумал:
- (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;
}
Я не уверен, почему, но комбинация удаления из супервизора, а затем установка на нуль действительно уменьшает использование памяти. Я вызываю этот метод в представлении контроллераDidDisappear.
Другие вещи, которые я пробовал, но без значительного эффекта:
1) Создание autoreleasepool вокруг alloc init mkMapView
2) Настройка отображаемой области вокруг lat 84 lon -30, как я думал, Векторная информация в Арктике может быть не такой плотной... Тем не менее, не помогает;)
Эта проблема очень серьезная, и наше приложение нестабильно и вызывает массу предупреждений о памяти в iOS 6. Надеемся, что Apple выпустит лучшее исправление, чем мое... скоро!!
Пожалуйста, критикуйте мое исправление и придумайте более эффективные методы сокращения использования памяти при отбрасывании карты. Спасибо!
Ответ 3
У меня такая же проблема.
Память никогда не открывается после масштабирования и изменения местоположения.
Единственный трюк, который я нашел, - это изменить тип карты после предупреждения о памяти.
Ответ 4
Эта проблема все еще присутствует в iOS 9 - если вы этого не сделаете.
Перейдите к контроллеру представления и из него с видом карты, который был настроен на панели рассказов, вызывает крушение (для меня) после 10-15 циклов показа и увольнения.
Теперь кажется, что исправление прост. Добавление этого
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
mapView.removeFromSuperview()
}
Кажется, исправить эту проблему, цикл может повторяться до и из более чем 20 раз, и никаких проблем. Без падений!!
Надеюсь, это поможет. Это была разочаровывающая проблема и рад ее решению.
Ответ 5
Мой след был: 2.48; 19,51; 49,64; 12.60, а именно: Память перед загрузкой mapView после загрузки mapView после небольшого увеличения/выключения изображения и после отпускания mapView (что довольно неприятно, даже после выпуска mapView я сохраняю 10 Мбайт приращения и не уходит вниз!)
В любом случае, я больше не использую IBOutlet для MapView, вместо этого создаю все в коде. Новый след теперь: 2.48; 19,48; 38,42; 12.54.
Все еще работаем над тем, чтобы положить bi *** вниз.
Ответ 6
Не решение, а просто трюк...
... изменить mapType = > память выпуска mapkit.
Даже если это изменение составляет долю секунды.
Ответ 7
У меня такое же чувство и не знаю, как release
этот memory
, даже если MKMapView
не используется.
Я выпустил контроллер, MKMapView
, контейнерный вид... memory
все еще используется.
Не забывайте об этом со старым MKMapView
в iOS5.
Ответ 8
Я получаю ту же самую проблему -
Я не совсем уверен в этом, но может быть, что новые карты Apple предваряют огромную площадь карты, чтобы обслуживать автономную навигацию?
Если вы отключите свое соединение после того, как карта загрузилась, попробуйте и увеличьте масштаб в областях, где-то рядом с желаемым местоположением, тогда, кажется, есть еще много лишних деталей.
Ответ 9
- (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];
}
Ответ 10
Для тех, кто находится здесь в 2014 году (iOS8 и выше)
Я столкнулся с этой проблемой в iOS 7+, пытаясь поддерживать более старые устройства (думаю, Ipad 2 с 512 МБ).
Мое решение - отключить Zoom, так как он занимает большую часть памяти.
long mem = [NSProcessInfo processInfo].physicalMemory;
if(mem < _memory_threshold){
self.MapView.zoomEnabled = NO;
}
Я пробовал все: от переключения типов карт, до освобождения карты, установки делегата на нуль, удаления всех оверлеев, аннотаций и т.д.
Ничто не работает на iOS7+. Фактически, большинство из этих исправлений вызывают скачки в памяти, поскольку MKMapView, кажется, течет и никогда не отменяет dealloc (я проверил через sub-classing, что я вижу dealloc hit).
Это отстой, но до сих пор все, что я придумал, - это отключение функций карты (масштабирование, прокрутка, взаимодействие с пользователем) в качестве средства для ограничения ужасного количества памяти, которое занимает MKMapView. Это привело к тому, что мое приложение, по крайней мере, было полустабильным на более старых устройствах.
Ответ 11
Не уверен в последствиях.
Как бы то ни было настройку карты на "nil", когда исчезнет вид, мне удалось уменьшить использование памяти с ~ 250 МБ до ~ 50-60 МБ.
-(void)viewDidDisappear:(BOOL)animated
{
self.map = nil;
}
Ответ 12
Для устранения проблемы с памятью достаточно только следующих строк:
Для Objective-C:
- (void) applyMapViewMemoryFix {
[self.mkMapView removeFromSuperview];
self.mkMapView = nil;}
Для Swift 3.0:
func applyMapViewMemoryFix() {
mapView.removeFromSuperview()
self.mapView = nil
}