看起來我正遇到一個問題,即如果在地圖的可見區域正在更改時添加註釋,我可以可靠地導致我的MKMapView
崩潰。我煮,是造成它歸結爲一個非常簡單的實現代碼,我在這裏重現它:如果在添加註釋時縮放MKMapView會崩潰
NSMutableArray *pointAnnotationArray = [[NSMutableArray alloc] init];
MKCoordinateRegion coordRegion = [mapViewOutlet region];
float randMax = 0.1;
for (int i = 0; i < 100; i++){
float randomDeviation1 = (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * randMax) - (randMax/2);
float randomDeviation2 = (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * randMax) - (randMax/2);
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
CLLocationCoordinate2D pointLocation = CLLocationCoordinate2DMake(coordRegion.center.latitude + randomDeviation1, coordRegion.center.longitude + randomDeviation2);
[point setCoordinate:pointLocation];
[pointAnnotationArray addObject: point];
}
[mapViewOutlet addAnnotations:[NSArray arrayWithArray:pointAnnotationArray]];
我在做什麼上面是隨機分佈在地圖上添加100分(足夠)在MKMapView的可見區域內和周圍。最簡單的方法是將此代碼設置爲在定時器上運行(例如5秒後),然後抓取地圖並開始放大和縮小,直到定時器運行。一旦你感覺到它,你可以每次都會發生崩潰。調用addAnnotations
之前在mapViewOutlet
上禁用用戶交互似乎沒有幫助。 (也許這是不能禁用用戶交互,而用戶是中間手勢,這是可以理解的,我想。)
我的其他問題是,我沒有太多的運氣追蹤崩潰 - 我不有很多經驗導致不會直接在我自己的代碼中發生崩潰,所以我可能會錯過一些顯而易見的方式來跟蹤它,但我目前在main.m
return UIApplicationMain
行上獲得無益的斷點。我最好的猜測是,我們在MKMapView
只繪製可見註釋方面引發了一些問題 - 縮放導致可見區域發生變化,同時添加註釋並且地圖試圖確定繪製哪些點。
有沒有其他人看到過這個?有關如何避免它的任何建議,而無需將我的地圖從用戶交互鎖定在我的註釋添加的任何一端的相當長的時間?
編輯:忘了包括調用堆棧:
#0 0x3752a944 in objc_exception_throw()
#1 0x3869dec0 in __NSFastEnumerationMutationHandler()
#2 0x31929d46 in -[MKAnnotationContainerView _updateAnnotationViewPerspective]()
#3 0x3192981a in -[MKMapView _updateScrollContainerView:]()
#4 0x3192ff66 in -[MKMapView mapViewDidDraw:]()
#5 0x391560b4 in -[VKMapCanvas didDrawView]()
#6 0x3914d4a8 in -[VKScreenCanvas onTimerFired:]()
#7 0x3914b4a8 in -[VKMapCanvas onTimerFired:]()
#8 0x3914a346 in -[VKMainLoop displayTimerFired:]()
#9 0x35ebe780 in CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)()
#10 0x35ebe6d8 in CA::Display::IOMFBDisplayLink::callback(__IOMobileFramebuffer*, unsigned long long, unsigned long long, unsigned long long, void*)()
#11 0x34815fd6 in IOMobileFramebufferVsyncNotifyFunc()
#12 0x370315ac in IODispatchCalloutFromCFMessage()
#13 0x3866888a in __CFMachPortPerform()
#14 0x386733e6 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__()
#15 0x3867338a in __CFRunLoopDoSource1()
#16 0x3867220e in __CFRunLoopRun()
#17 0x385e523c in CFRunLoopRunSpecific()
#18 0x385e50c8 in CFRunLoopRunInMode()
#19 0x3591e33a in GSEventRunModal()
#20 0x379d5290 in UIApplicationMain()
#21 0x0005aff4 in main at /Users/Sydin/App/main.m:16
感謝您的建議;這確實是訣竅。另外,我應該更加明確,但是我在測試中使用了異常斷點,這就是爲什麼我不能獲得關於異常的更多信息的原因。 – Sydin