2011-11-05 71 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行。