iOS6 MKMapView, используя тонну памяти, до момента сбоя приложения, кто - нибудь еще это заметил?


есть ли кто-нибудь еще, кто использует карты в своих приложениях iOS 6, замечая чрезвычайно высокое использование памяти до момента получения предупреждений памяти снова и снова до момента сбоя приложения?

Я запустил приложение через инструменты, и я не вижу никаких утечек, и до тех пор, пока не будет создан вид карты, приложение последовательно работает примерно на ~3 МБ живых байтов. После того, как карта создана и плитки загружаются живые байты прыгает до ~13 мб живых байтов. Затем, когда я перемещаю карту и масштабирую вход и выход живых байтов продолжается, чтобы подняться, пока приложение не выйдет из строя примерно на ~40 Мб живых байтов. Кстати, это на iPhone 4. На iPod touch он падает еще раньше.

Я повторно использую аннотации представления правильно и ничего не протекает. Кто-нибудь еще видит такое же высокое использование памяти с новыми картами iOS 6? Кроме того, у кого-нибудь есть решение?

12 52

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. Это привело в мое приложение, по крайней мере, будучи полустабильных на старых устройствах.

Не уверен в последствиях.

как когда-либо установка карты на "ноль" всякий раз, когда вид исчезает, помог мне уменьшить использование памяти с ~250 МБ до ~50-60 МБ.

-(void)viewDidDisappear:(BOOL)animated
{
     self.map = nil; 
}

для решения проблемы с памятью достаточно только следующих строк:

Для Цели-C:

- (void) applyMapViewMemoryFix {
  [self.mkMapView removeFromSuperview];
  self.mkMapView = nil;}

Для Swift 3.0:

func applyMapViewMemoryFix() {
    mapView.removeFromSuperview()
    self.mapView = nil
}