谷歌地图崩溃与集合<__NSArrayM:0x17d280e0>在被枚举时发生了变异



Google Maps SDK版本:2.0.1

iOS版本:9.3。9.2 x。x 7.0.x

弧启用。

崩溃堆栈:集合<__NSArrayM: 0x17d280e0>在枚举时发生了突变

0  CoreFoundation                 0x2501c10b __exceptionPreprocess
1  libobjc.A.dylib                0x247c2e17 objc_exception_throw
2  CoreFoundation                 0x2501bb91 -[NSException name]
3  MyApp                          0x18e1b5 -[GMSVectorMapView buildVisibleAccessibilityItems]
4  MyApp                          0x2a2d13 -[GMSMapView updateOverlay:]ssfsdf
5  MyApp                          0x2dc04f -[GMSOverlay setMap:]
6  MyApp                          0xce87b __25-[VCMain updateMarkersOnMap]_block_invoke (VCMain.m:1186)
7  libdispatch.dylib              0x24b95b5b _dispatch_call_block_and_release
8  libdispatch.dylib              0x24ba4921 _dispatch_root_queue_drain
9  libdispatch.dylib              0x24ba4305 _dispatch_worker_thread3
10 libsystem_pthread.dylib        0x24d53b29 (Missing)
11 libsystem_pthread.dylib        0x24d53718 (Missing)

执行以下代码时会发生崩溃:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0 {
    NSArray *coordinates = [networkClient getCoordinates];
    for (NSDictionary *coord in coordinates) {
        double double_lat = [[coord objectForKey:@"geoy"] doubleValue];
        double double_long = [[coord objectForKey:@"geox"] doubleValue];
        CLLocationCoordinate2D location = CLLocationCoordinate2DMake(double_lat, double_long);
        GMSMarker *marker = [GMSMarker markerWithPosition:location];
        marker.icon = [UIImage imageNamed: @"image"];
        marker.title = title;
        marker.snippet = subtitle;
        marker.groundAnchor = CGPointMake(0.5, 0.5);
        marker.map = mapMainGoogle; // crash
    }
}

我的应用程序还执行以下代码:

[mapMainGoogle clear];

我试图把[GMSMarker setMap]和[GMSMapView clear]方法在@synchronized(mapMainGoogle)或NSLock锁定/解锁。但它没有帮助,崩溃仍然出现。

当我将这些方法放入dispatch_async(dispatch_get_main_queue())块中时,它随机崩溃,并出现以下崩溃:

崩溃栈:EXC_BAD_ACCESS KERN_INVALID_ADDRESS

0  libobjc.A.dylib                0x22a43a86 objc_msgSend + 5
1  MyApp                          0x18f6d7 -[NSThread(GTMBlocksAdditions) GMSx_gtm_performBlock:] + 1435351
2  MyApp                          0x2a3025 -[GMSMarker displayLayer:] + 360140
3  QuartzCore                     0x258dca83 CA::Layer::display() + 106
4  MyApp                          0x2dbda5 -[GMSMarkerLayer display] + 592972
5  QuartzCore                     0x258c0f0d CA::Layer::display_if_needed(CA::Transaction*) + 208
6  QuartzCore                     0x258c0bc5 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24
7  QuartzCore                     0x258c0081 CA::Context::commit_transaction(CA::Transaction*) + 368
8  QuartzCore                     0x258bfd55 CA::Transaction::commit() + 520
9  QuartzCore                     0x258eda73 CA::Transaction::release_thread(void*) + 310
10 libsystem_pthread.dylib        0x22fab905 _pthread_tsd_cleanup + 508
11 libsystem_pthread.dylib        0x22fab507 _pthread_exit + 86
12 libsystem_pthread.dylib        0x22faae21 _pthread_wqthread + 1044
13 libsystem_pthread.dylib        0x22faa9fc start_wqthread + 8

错误消息告诉您哪里出了问题:在枚举数组时它被修改了。例如,通过使用不可变数组可以改进这一点。"@synchronized"不能帮助你,因为你是在一个后台线程中迭代,它将不知道@synchronized。

最新更新