2011-11-05 29 views
9

我已经构建了一个旨在显示某些叠加层的应用程序。覆盖层的形式是多边形,外圈最多可达10000个点。但这里的高点似乎不成问题。在过去的几天里,我一直在简化我的应用程序,以便找到一个包含MapView的简单View。视图从xib加载(连接插座和代理)。覆盖层是在方法中创建的 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)动画并添加到mapView中。iOS 5 MapKit在缩放/平移时使用叠加层崩溃

演示(可在此处获得https://github.com/nebucaz/mapkit)显示MapView,并在地图放大/缩小或平移时添加红色三角形。当玩弄缩放和平移(密集和快速)MapView时,应用程序崩溃。对模拟器进行字符编码很容易,在设备上尽管可能会更困难(我可以提供崩溃日志)。

有两个演示:MapCrash和MapCrashStatic。第一个在地图周围创建多个多边形,具体取决于一个平移/缩放的位置。第二只具有在创建一个单一的,静态的多边形 - (无效)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工具。

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

我现在打猎这个崩溃的一个多星期,仍然假设我曲解了KMLViewer演示(苹果)或做错事(向我附近的其他iOS开发者发放信用卡!)

不过,我很感谢您的建议和对此事的帮助。

+2

只是为了与我的几个美分价值,我目前有完全相同的问题。我有一个NSMutableArray包含支持MKOverlay协议的对象列表。如果可变数组中的对象被移除,它也会从mapview中移除。但是,当我重复缩放发生以下堆栈跟踪: – Diziet

+1

'不能访问内存地址0x1 (gdb)其中 #0 0x00000001在? () #1 0x011a741c在CGPathCreateMutableCopyByTransformingPath() #2 0x01220d23在CGContextAddPath() #3 0x003be3e1在MKMapRectRemainder() #4 0x003be498在MKMapRectRemainder() #5 0x003cab01在MKTilesRequireGoogleLegalNotices() #6 0x029f3c17在 - [CALayer的drawInContext:]() #7 0x02a107e3在tiled_layer_render() #8 0x0292b127在CAImageProviderThread() #9 0x021804e6在_dispatch_worker_thread2() #10 0x9c981b24在_pthread_wqthread() #11 0x9c9836fe在start_wqthread() ' – Diziet

+2

感谢@ Diziet分享。我上周在Apple Developer Network开了一个TSI,然后被要求提交一个bug。我被告知目前没有可用的解决方法,并且该错误将被调查。我会发表进一步的评论。 – Snel

回答

3

你可能已经想到了这个,但是我看到很多来自MapKit的看起来不同寻常的不速之客都来自于不删除委托。只要确保在释放之前将地图视图的委托设置为零。

此外,我看到许多开发人员倾向于在他们的地图视图上使用performSelector:afterDelay:。只要您在正确的位置放置了一个取消执行呼叫,那也可以。

+0

坦克@大卫分享你的想法。在我的例子中,我确实错过了在发布之前将mapView的委托设置为零。我从来没有想过这个,因为地图在使用和绘制地图时会崩溃。我用'self.theMapView.delegate = nil更新了这个例子; [self.theMapView发布]; self.theMapView = nil;'示例代码从不执行'performSelector'。就目前而言,崩溃依然存在。 – Snel

0

删除方法zoomToPolyLine并使用mapViewDidUpdateLocation放大poly行。