【问题标题】:iOS 5 MapKit Crashes with Overlays when zoom/pan缩放/平移时,iOS 5 MapKit 崩溃并带有叠加层
【发布时间】:2011-11-05 19:15:22
【问题描述】:

我已经构建了一个旨在显示一些叠加层的应用程序。叠加层采用多边形形式,外环最多有 10000 个点。但是高分似乎不是这里的问题。在过去的几天里,我一直在简化我的应用程序,只是为了找到一个包含 MapView 的简单视图。视图是从 xib 加载的(连接了出口和委托)。叠加层是在方法中创建的 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 并添加到 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) 

Backtrace 总是相同的,它在库代码中的同一点崩溃。我使用工具(僵尸、泄漏、分配)进行了分析,还对过度保留的对象进行了一些测试。我认为这是一个内存问题,但我还不能启动 Malloc Guard。崩溃可能会在多台机器上重现——即使我刚刚重新安装了 Xcode-tools 也很困难。

stackoverflow.com 上的其他帖子也处理 MapKit 中的突然崩溃,但要么没有为我的问题提供直接解决方案,要么不得不处理委托和其他视图转换或应用程序启动/停止问题。 ARC 在我的项目中关闭。

我已经追查这个崩溃一个多星期了,仍然认为我误解了 KMLViewer 演示(Apple)或做错了事情(感谢我附近的其他 iOS 开发人员!)

不过,在这件事上,我非常感谢您的建议和帮助。

【问题讨论】:

  • 只是为了配合我的几分钱,我目前有完全相同的问题。我有一个 NSMutableArray 包含支持 MKOverlay 协议的对象列表。如果可变数组中的对象被删除,它也会从地图视图中删除。但是,当我反复缩放时,会出现以下堆栈跟踪:
  • Cannot access memory at address 0x1 (gdb) where #0 0x00000001 in ?? () #1 0x011a741c in CGPathCreateMutableCopyByTransformingPath () #2 0x01220d23 in CGContextAddPath () #3 0x003be3e1 in MKMapRectRemainder () #4 0x003be498 in MKMapRectRemainder () #5 0x003cab01 in MKTilesRequireGoogleLegalNotices () #6 0x029f3c17 in -[CALayer drawInContext:] () #7 0x02a107e3 in tiled_layer_render () #8 0x0292b127 in CAImageProviderThread () #9 0x021804e6 in _dispatch_worker_thread2 () #10 0x9c981b24 in _pthread_wqthread () #11 0x9c9836fe in start_wqthread ()
  • 感谢@Diziet 的分享。上周我在 Apple Developer Network 上开设了一个 TSI,然后被要求提交一个错误。有人告诉我,目前没有可用的解决方法,并且将调查该错误。我会发布更多关于进展的 cmets。
  • 这是一种解决方法 - 将所有叠加层压缩为少量复合叠加层。 devforums.apple.com/thread/48154?tstart=0
  • 我的 TSI 确认这是一个错误。结合使用上述链接和 Apple 的“面包屑”示例,我在使用 3 个叠加层时不再出现崩溃。所以看起来 3 是安全的。

标签: ios crash mapkit overlay android-mapview


【解决方案1】:

您可能已经考虑过这一点,但我已经看到了许多来自 MapKit 的不同外观的崩溃程序,所有这些都源于没有取消委托。只需确保在发布之前将地图视图的委托设置为 nil。

此外,我看到许多开发人员倾向于在他们的地图视图中使用 performSelector:afterDelay:。只要您在正确的位置也调用了 cancelperform 就可以了。

【讨论】:

  • 感谢@David 分享您的想法。在我的示例中,我确实错过了在发布之前将 mapView 的委托设置为 nil。我从来没有想过这个,因为地图在使用和绘制地图时会崩溃。我用 `self.theMapView.delegate = nil; 更新了示例[self.theMapView 发布]; self.theMapView = nil;` 示例代码从不执行performSelector。目前,崩溃仍然存在。
【解决方案2】:

移除方法 zoomToPolyLine 并使用 mapViewDidUpdateLocation 放大折线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2017-02-26
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多