Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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
}