Использование памяти MKMapView выходит из-под контроля с помощью setRegion: звонки - PullRequest
3 голосов
/ 25 мая 2010

У меня есть один MKMapView экземпляр, который я программно добавил к UIView. В качестве части пользовательского интерфейса пользователь может циклически просматривать список адресов, и представление карты обновляется, чтобы отображать правильную карту для каждого адреса по мере их прохождения пользователем. Я создаю вид карты один раз и просто изменяю то, что он отображает, с помощью setRegion:animated.

Проблема в том, что каждый раз, когда карта меняется на новый адрес, использование памяти моей программой увеличивается на 200-500 КБ (как сообщает Memory Monitor в Instruments). Согласно Распределению объектов, кажется, что каждый раз происходит много Mallocs 1.0K, и панель Extended Detail для этих распределений 1.0K показывает, что Responsible Caller - это convert_image_data, а панель Extended Detail показывает, что это результат [MKMapTileView drawLayer:inContext:]. Таким образом, мне кажется вероятным, что использование памяти происходит из-за того, что MKMapView не освобождает память, которую он использует для перерисовки карты каждый раз. На самом деле, когда я вообще не отображаю карту (даже не добавляя ее в качестве подпредставления моего основного UIView), но все еще циклически перебираю адреса (которые изменяют различные UILabels и другую отображаемую информацию), использование памяти для приложения делает НЕ увеличивать. Если я добавляю вид карты, но никогда не обновляю его с помощью setRegion:, память также НЕ увеличивается при переходе на новый адрес.

Еще один бит информации: если я перейду на новый адрес (и, следовательно, прошу карту отобразить новый адрес), память скачет, как описано выше. Однако, если я вернусь к адресу, который уже отображался, память не перескочит, когда карта перерисовывается со старым адресом. Также это происходит на iPad (реальное устройство) с 3.2 и на iPhone (опять же, на реальном устройстве) с 3.1.2.

Вот как я инициализирую MKMapView (я делаю это только один раз):

CGRect mapFrame;
mapFrame.origin.y = 460;              // yes, magic numbers. just for testing.
mapFrame.origin.x = 0;
mapFrame.size.height = 500;
mapFrame.size.width = 768;
mapView = [[MKMapView alloc] initWithFrame:mapFrame];
mapView.delegate = self;
[self.view insertSubview:mapView atIndex:0];

И в ответ на выбор пользователем адреса я установил карту так:

MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=kStreetMapSpan;  // 0.003
span.longitudeDelta=kStreetMapSpan; // 0.003

region.center = address.coords;     // coords is CLLocationCoordinate2D
region.span = span;

mapView.region.span = span;
[mapView setRegion:region animated:NO];

Есть мысли? Я обыскивал сеть, но не видел упоминаний об этой проблеме, и я достиг пределов своих знаний по инструментам. Спасибо за любые идеи.

1 Ответ

0 голосов
/ 28 ноября 2010

Что происходит, когда вы возвращаетесь к исходному адресу? Это все еще увеличивается?

Я думаю, что он, вероятно, кеширует данные карты, поэтому он естественно увеличивается, поскольку сохраняет другие места в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...