iOS 5地图套件在缩放/平移时与覆盖物一起崩溃

9
我已经开发了一个应用程序,旨在显示一些覆盖层。这些覆盖层是由多边形组成的,外环有多达10000个点。但高数量的点似乎并不是问题所在。在过去的几天里,我一直在简化我的应用程序,最终只剩下一个包含MapView的简单视图。该视图从xib加载(连接了outlets和delegate)。覆盖层是在方法-(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)总是相同的,在库代码的同一点崩溃。我使用了工具(Zombies、Leaks、Allocations)进行了分析,并且还进行了一些关于过度保留对象的测试。我认为这可能是一个内存问题,但我还无法启动Malloc Guard。即使我只重新安装了Xcode工具,该崩溃也可以在多台机器上复现。
Stackoverflow.com上的其他帖子也涉及MapKit的突然崩溃,但要么没有直接解决我的问题,要么必须处理委托和其他视图转换或应用程序启动/停止问题。我的项目中关闭了ARC。 我已经寻找这个崩溃已经超过一个星期了,仍然认为我误解了KMLViewer演示(Apple)或者做错了某些事情(感谢我的邻居iOS开发人员!)
尽管如此,我仍然非常感谢您在这个问题上提供的建议和帮助。

2
只是想发表一下我的看法,我目前也遇到了完全相同的问题。我有一个NSMutableArray,其中包含支持MKOverlay协议的对象列表。如果可变数组中的对象被删除,则它也会从地图视图中删除。但是,当我反复缩放时,会出现以下堆栈跟踪: - Diziet
1
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
2
感谢@Diziet的分享。上周我在苹果开发者网络上打开了一个TSI,然后被要求提交一个bug。我被告知目前没有可用的解决方法,该bug将会被调查。我会发布进展的更多评论。 - Snel
1
这是一种解决方法 - 将所有叠加层压缩成少量的复合叠加层。https://devforums.apple.com/thread/48154?tstart=0 - Undistraction
1
我的TSI确认这是一个bug。使用上面链接和苹果公司的“Breadcrumb”示例的组合,当使用3个覆盖层时,我不再遇到崩溃问题。因此,似乎3是安全的。 - Undistraction
显示剩余9条评论
2个回答

3

你可能已经想到了,但我见过很多不同的MapKit崩溃都源于没有将delegate赋值为nil。在释放之前,请确保将地图视图的delegate设置为nil。

此外,我见过一些开发人员倾向于在他们的地图视图上使用performSelector:afterDelay:。只要你在正确的地方放置cancelperform调用,那么这样做是可以的。


感谢 @David 分享你的想法。在我的例子中,我确实忘记在释放之前将 mapView 的委托设置为 nil。我从未考虑过这一点,因为地图在使用和绘制地图时崩溃。我更新了示例代码,加入了 self.theMapView.delegate = nil; [self.theMapView release]; self.theMapView = nil;。目前,该示例代码从未执行过 performSelector。但是,崩溃问题仍然存在。 - Snel

0

移除zoomToPolyLine方法,使用mapViewDidUpdateLocation方法来对折线进行缩放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接