У меня есть один 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];
Есть мысли? Я обыскивал сеть, но не видел упоминаний об этой проблеме, и я достиг пределов своих знаний по инструментам. Спасибо за любые идеи.