iOS 5 MapKit вылетает при наложении при масштабировании / панорамировании - PullRequest
9 голосов
/ 05 ноября 2011

Я создал приложение, предназначенное для отображения некоторых оверлеев.Наложения имеют форму многоугольников с количеством точек на внешнем кольце до 10000.Но большое количество очков здесь не является проблемой.В последние несколько дней я продолжал упрощать свое приложение, просто чтобы найти себя с простым представлением, содержащим MapView.Представление загружается из xib (с подключенными розетками и делегатом).Наложение создается в методе - (void) mapView: (MKMapView *) mapView regionDidChangeAnimated: (BOOL) анимируется и добавляется в mapView.

Демонстрация (которая доступна здесь https://github.com/nebucaz/mapkit) показываетMapView и добавляет красный треугольник при увеличении / уменьшении или панорамировании карты. При масштабировании и панорамировании (интенсивно и быстро) MapView происходит сбой приложения. Имитировать симулятор легко, на устройстве это значительносложнее, даже если это возможно (я могу предоставить краш-журнал).

Есть две демонстрации: MapCrash и MapCrashStatic. Первая создает несколько полигонов вокруг карты в зависимости от того, где одна панорама / масштабирование. Вторая имеет толькоодин статический многоугольник, который создается в - (void) viewDidLoad, а затем добавляется при каждом вызове mapView regionDidChangeAnimated

Приложение всегда падает со следующей обратной трассировкой:

Attaching to process 8745.
MapCrash(8745) malloc: protecting edges
[Switching to process 8745 thread 0x1820b]
[Switching to process 8745 thread 0x1820b]
(gdb) backtrace
#0  0x00000000 in ?? ()
#1  0x00e81a60 in CG::Path::apply_transform ()
#2  0x00ed741c in CGPathCreateMutableCopyByTransformingPath ()
#3  0x00f50d23 in CGContextAddPath ()
#4  0x000f11dc in MKRoadWidthAtZoomScale ()
#5  0x000ee498 in MKMapRectRemainder ()
#6  0x000fab01 in MKTilesRequireGoogleLegalNotices ()
#7  0x02723c17 in -[CALayer drawInContext:] ()
#8  0x027407e3 in tiled_layer_render ()
#9  0x0265b127 in CAImageProviderThread ()
#10 0x01eb04e6 in _dispatch_worker_thread2 ()
#11 0x98f44b24 in _pthread_wqthread ()
#12 0x98f466fe in start_wqthread ()
(gdb) 

Обратной трассировкой являетсявсегда один и тот же, он падает в одной и той же точке кода библиотеки. Я анализировал с помощью инструментов(зомби, утечки, выделения), а также сделал некоторые испытания с чрезмерно удержанными объектами.Я предполагал, что это проблема памяти, но я еще не смог запустить Malloc Guard.Авария может быть воспроизведена на нескольких машинах - даже если я просто переустановил Xcode-tools.

Другие публикации на stackoverflow.com также имеют дело с внезапным сбоем в MapKit, но либо не предлагают прямого решения моей проблемы, либодолжен был иметь дело с делегатом и другими проблемами перехода-представления или запуска / остановки приложения.ARC отключен в моих проектах.

Я охотюсь на этот сбой уже более недели, все еще предполагая, что я неверно истолковал демонстрацию KMLViewer (Apple) или что-то сделал не так (Кредиты другим разработчикам iOS в моем районе!)

Тем не менее, я был бы признателен за ваши предложения и помощь в этом вопросе.

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Вы, наверное, уже думали об этом, но я видел множество отчетливо выглядящих сбоев из MapKit, которые все происходили из-за того, что не исключили делегата. Просто убедитесь, что вы установили делегат вида карты на ноль, прежде чем его отпустить.

Кроме того, я видел ряд разработчиков, склонных использовать executeSelector: afterDelay: в своем виде карты. Это нормально, если вы делаете запрос на отмену в нужных местах.

0 голосов
/ 04 февраля 2016

удалите метод zoomToPolyLine и используйте mapViewDidUpdateLocation, чтобы увеличить линию поли.

...