Я работаю на игру iPhone, которая использует MKMapView как лопая. Спустя всего несколько минут игры приложение неизбежно начинает становиться вялым и в конечном итоге выходит из строя из-за нехватки памяти. После того, как копаться виновником, кажется, что вид карты постоянно требует больше памяти. Игра требует много масштабирование и панорамирование карты, поэтому я могу только предположить, что кэш МАП плитки просто продолжает расти до тех пор, пока не закончится память. Есть ли способ заставить вид карты, чтобы очистить его кэш плитки или содержит это потребление памяти?
Очистить кэш MKMapView в плитки?
* Примечание: Этот ответ относится только к прошивке 4.1 и ниже. Проблемы, описанные в этом ответе были в основном зафиксированы в прошивкой 4.2 *
Я делал некоторое рытье на это как мое приложение использует как карту, а также имеет другие функции, которые требуют высокой оперативной памяти.
Я не нашел ответ, но обходной путь. Требования памяти MKMapView в эскалации экспоненциально при увеличении ближе к области, и панорамирование в пределах этого увеличенного области.
Есть два уровня кэша плитки MKMapView. Один проявляется как таНос ~ 196kb в инструментах, другой NSData (магазин) различных размеров.
Malloc по-видимому, активные плитки в использовании, и есть жесткий лимит на сколько может быть выделено. В моем приложении, что число 16, не уверен, если его в зависимости от размера UIView или нет. Эти ассигнования, похоже, строго управляется, и он реагирует на предупреждения памяти.
Во всяком случае, на определенном уровне масштабирования, скажем, уровень континента (достаточно, чтобы соответствовать большей части Северной Америки в экране IPad), учитывая размер плитки, если никогда не должен добраться до этого второго уровня кэширования (NSData (магазин) ) для того, чтобы завершить карту. Все свежее и чистое. Если я загрузить в тонне внешних изображений в активную память, плитка подрезать себя. Потрясающие!
Проблема возникает, когда она попадает, что второй уровень кэширования. Это происходит, когда вы увеличиваете, и вдруг вместо 16 плиток, чтобы показать всю planat, она нуждается в 16 плиток просто чтобы показать Лос Angelas, и, как вы панорамирование вместо того, чтобы просто сбрасывать старые плитки он помещает их в NSData (магазин ) распределения, где они, кажется, никогда не получить свободу.
Это NSData (магазин) является NSURLConnectionCache, который существует по умолчанию только в памяти. Вы не можете получить доступ к этой кэш, чтобы ограничить его, потому что это не кэш по умолчанию общий (уже пробовал).
Так что это, где я застрял.
Неудовлетворительный ответ, что если отключить масштабирование карты и зафиксировать его на достаточно широком уровне масштабирования, вы можете избежать этой проблемы полностью, но, очевидно, некоторые приложения нуждаются в этом ... и это, насколько я получил.
Я подал заявку в службу поддержки с Apple, чтобы увидеть, если они могут разглашать какое-либо образом ограничить этот нелепый кэш для отображения (который, кстати, я был в состоянии случайно провернуть до 50 и более мегабайта оперативной памяти, выделенного в активной памяти).
Надеюсь это поможет.
редактировать
Следующий релиз IOS, кажется, решить эту проблему безграничную кэша. MKMapView в настоящее время активно обрезает свои данные кэшируются плитки. Радуйтесь!
Есть параметр идентификатора повторного использования на ваших взглядов аннотаций? (Это означает, что система может отделить эти мнения и только сохранить небольшое количество просмотров в памяти одновременно. Это также увеличивает производительность прокрутки, потому что прокрутка будет повторно использовать отдельные виды.)
Используйте этот метод, чтобы получить представление аннотаций быть повторно использовано:
- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier
Если вы создаете приложение с просто MapKit и размером зрения 768x1024 (размера Ipad), приложение может легко потреблять более 30+ МБ «Живые Bytes», как сообщает программа инструментов перерасчетов. Это было замечено, работает на v3.2.2 IPad IOS (последнюю версию до следующей недели предполагается 4.2 релиза). Из моих исследований, кажется, что это количество памяти много для одного приложения, где большинство разработчиков сообщают получение 1-го уровня памяти предупреждения около 15-25 МБ и падают вскоре после этого уровня.













