iOS6 MKMapView, используя тонну памяти, до момента сбоя приложения, кто - нибудь еще это заметил?
есть ли кто-нибудь еще, кто использует карты в своих приложениях iOS 6, замечая чрезвычайно высокое использование памяти до момента получения предупреждений памяти снова и снова до момента сбоя приложения?
Я запустил приложение через инструменты, и я не вижу никаких утечек, и до тех пор, пока не будет создан вид карты, приложение последовательно работает примерно на ~3 МБ живых байтов. После того, как карта создана и плитки загружаются живые байты прыгает до ~13 мб живых байтов. Затем, когда я перемещаю карту и масштабирую вход и выход живых байтов продолжается, чтобы подняться, пока приложение не выйдет из строя примерно на ~40 Мб живых байтов. Кстати, это на iPhone 4. На iPod touch он падает еще раньше.
Я повторно использую аннотации представления правильно и ничего не протекает. Кто-нибудь еще видит такое же высокое использование памяти с новыми картами iOS 6? Кроме того, у кого-нибудь есть решение?
12 ответов:
после многих игр и тестирования различных идей, некоторые из которых были упомянуты здесь, окончательное решение, которое сработало для меня, было следующим.
вместо того, чтобы создавать новые MKMapView по мере необходимости в приложении, я добавил свойство mkMapView в свой AppDelegate и создал его только при необходимости. Как только он был создан, он живет в AppDelegate навсегда, и я повторно использую этот единственный экземпляр везде, где это необходимо. Это действительно помогло в уменьшении объема памяти будучи использованным, поскольку я ранее создавал несколько разных MKMapView, и оба они довольно быстро прожигали память.
Я также обнаружил, что iOS 6 Maps очень хорошо справляется с освобождением памяти после получения предупреждения о памяти. Да, он использует больше памяти при масштабировании и панорамировании, но, похоже, отвечает на предупреждения памяти соответствующим образом.
последнее, что мне нужно было сделать, это работать над уменьшением моей общей начальной памяти след. Я заметил, что начинал намного выше, чем ожидал, так что это также способствовало сбоям, которые я получал, связанным с памятью. Как только я получил начальный след вниз, пусть MKMapView обрабатывает освобождение его памяти во время предупреждений памяти и убедился, что у меня был только 1 экземпляр MKMapView, который я мог бы повторно использовать во всем приложении, все работает нормально.
У меня также есть эта проблема, и это сводит меня с ума. Пытаясь выяснить исправление на основе сообщения Матео, это то, что я придумал:
- (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; }
Я не уверен, почему, но комбинация удаления из superview, а затем установка на ноль действительно уменьшает использование памяти. Я вызываю этот метод в viewDidDisappear контроллера.
другие вещи, которые я пробовал, но без значительного эффекта:
1) Создание autoreleasepool вокруг alloc init mkMapView
2) Установка отображаемой области вокруг lat 84 lon -30, поскольку я думал, что векторная информация в Арктике может быть не такой плотной... Однако, не помогает ;)
эта проблема очень серьезна и вызывает наше приложение, чтобы быть нестабильным и вызвать тонны предупреждений памяти в iOS 6. Надеюсь, что Apple выпустит исправление лучше, чем у меня... скоро!!
пожалуйста, критикуйте мое исправление и придумайте более эффективные методы сокращения использования памяти при отбрасывании карты. Спасибо!
Я испытываю ту же проблему.
память никогда не освобождается после масштабирования и изменения местоположения.
единственный трюк, который я нашел, чтобы изменить тип карты, после предупреждения памяти.
эта проблема все еще присутствует в iOS 9 - Если вы этого не сделаете.
переход к и от контроллера вида с видом карты, который был настроен в раскадровке, вызывает сбой (для меня) примерно через 10-15 циклов показа и увольнения.
теперь кажется, что исправить это просто. Добавление этого
override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) mapView.removeFromSuperview() }
Кажется, есть исправить проблему, может цикл и от более чем 20 раз, и не проблема. Никакой аварии!!
надеюсь, что это помогает. Это было неприятно проблема и рад ее решению.
мой след был: 2.48; 19.51; 49.64; 12.60 который является: память перед загрузкой mapView, после загрузки mapView, после увеличения/уменьшения масштаба немного, и после освобождения mapView (что довольно раздражает, даже после освобождения mapView, я держу 10Mb инкремент и он не идет вниз!)
в любом случае, я больше не использую IBOutlet для MapView, вместо этого я создаю все в коде. Новый след сейчас: 2.48; 19.48; 38.42; 12.54.
все еще работает на Би*** вниз.
Не решение, а просто хитрость...
... изменить mapType => MapKit освободить память.
даже если это изменение на доли секунды.
у меня такое же чувство и не знаю как
release
этойmemory
, даже еслиMKMapView
не используется.я выпустил контроллер,
MKMapView
, контейнер вид...memory
до сих пор применяется.не помню, чтобы испытать это с старых
MKMapView
в iOS5.
- (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]; }
Я получаю тот же вопрос -
Я не совсем уверен в этом, но может ли быть, что новые карты apple предварительно загружают огромную область карты для обслуживания автономной навигации?
Если вы отключите соединение после загрузки карты, а затем попробуйте увеличить масштаб в областях, нигде рядом с желаемым местоположением, то, похоже, все еще доступно очень много деталей.
для тех, кто путешествует здесь в 2014 году+ (iOS8 и выше)
я столкнулся с этой проблемой на iOS 7+, пытаясь поддерживать старые устройства (думаю, Ipad 2 с 512 МБ).
мое решение-отключить масштабирование, поскольку оно легко занимает большую часть памяти.
long mem = [NSProcessInfo processInfo].physicalMemory; if(mem < _memory_threshold){ self.MapView.zoomEnabled = NO; }
Я пробовал все от переключения типов карт до освобождения карты, установки делегата на ноль, удаления всех наложений, аннотаций и т. д.
ничего из этого работает на iOS7+. На самом деле, большинство из этих исправлений вызывают скачки в памяти, так как MKMapView, кажется, протекает и никогда не правильно dealloc (я проверил через подкласс, что я вижу dealloc hit).
это отстой, но все, что я придумал до сих пор, это отключение функций карты (масштабирование, прокрутка, взаимодействие с пользователем) в качестве средства ограничения чудовищного объема памяти, занимаемого MKMapView. Это привело в мое приложение, по крайней мере, будучи полустабильных на старых устройствах.