title: VectorKit crash reports with MKMapSnapshotter on iOS
body: <p>I'm getting different kind of crash reports related to <code>VectorKit</code> and <code>MKMapSnapShotter</code>. Crashes occur pretty random, but it seems like they happen most when returning from the background. The device does not send out any memory warnings before it happens.</p>
  
  <p>What's happening here?</p>
  
  <p>I'm using:</p>
  
  <pre><code>if (!_snapshotQueue) {
      _snapshotQueue = dispatch_queue_create("com.bestappever.snapshot", DISPATCH_QUEUE_SERIAL);
  }
  [_snapshotter cancel]
  _snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
  __weak __typeof(self)__self = self;
  [_snapshotter startWithQueue:queue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
      dispatch_async(dispatch_get_main_queue(), ^{
          __strong __typeof(__self)_self = __self;
          [_self doSomething];
      });
  }];
  </code></pre>
  
  <p>The most common one is as follows:</p>
  
  <pre><code>Thread 11 Crashed:
  0   libobjc.A.dylib                      0x38502b66 objc_msgSend + 5
  1   VectorKit                            0x35bc8997 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 51
  2   VectorKit                            0x35c1f88d -[VKTileProvider tileSource:invalidateKeys:] + 168
  3   VectorKit                            0x35c41325 -[VKTileSource didFailToLoadTileKey:error:] + 196
  4   GeoServices                          0x32ca906b ___ZN8LoadItem15deleteRequesterEP8NSStringbb_block_invoke + 87
  5   libdispatch.dylib                    0x389ec0c3 _dispatch_call_block_and_release + 11
  6   libdispatch.dylib                    0x389f0e7b _dispatch_queue_drain + 375
  7   libdispatch.dylib                    0x389edf93 _dispatch_queue_invoke + 43
  8   libdispatch.dylib                    0x389f1745 _dispatch_root_queue_drain + 77
  9   libdispatch.dylib                    0x389f19c5 _dispatch_worker_thread2 + 57
  10  libsystem_pthread.dylib              0x38b1bdff _pthread_wqthread + 298
  11  libsystem_pthread.dylib              0x38b1bcc4 start_wqthread + 8
  </code></pre>
  
  <p>Some other examples:</p>
  
  <pre><code>Thread 11 Crashed:
  0   libobjc.A.dylib                      0x3850a7aa lookUpImpOrForward + 94
  1   libobjc.A.dylib                      0x3850302b _class_lookupMethodAndLoadCache3 + 35
  2   libobjc.A.dylib                      0x38502df9 _objc_msgSend_uncached + 25
  3   VectorKit                            0x35bc8997 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 50
  4   VectorKit                            0x35bc895d -[VKTileProvider tileSource:didFetchTile:forKey:] + 60
  5   VectorKit                            0x35bc8915 -[VKTileSource fetchedTile:forKey:] + 44
  6   VectorKit                            0x35bc9a95 -[VKTileSetBackedTileSource fetchedTile:forKey:] + 212
  7   VectorKit                            0x35bc889d -[VKTileSource _fetchedTile:] + 224
  8   VectorKit                            0x35bc8409 __49-[VKTileSource decodeData:downloadKey:sourceKey:]_block_invoke_3 + 109
  9   libdispatch.dylib                    0x389ec0c3 _dispatch_call_block_and_release + 11
  10  libdispatch.dylib                    0x389f0e7b _dispatch_queue_drain + 375
  11  libdispatch.dylib                    0x389edf93 _dispatch_queue_invoke + 43
  12  libdispatch.dylib                    0x389f1745 _dispatch_root_queue_drain + 77
  13  libdispatch.dylib                    0x389f19c5 _dispatch_worker_thread2 + 57
  14  libsystem_pthread.dylib              0x38b1bdff _pthread_wqthread + 298
  15  libsystem_pthread.dylib              0x38b1bcc4 start_wqthread + 8
  
  
  Thread 6 Crashed:
  0   libsystem_kernel.dylib               0x390a41fc __pthread_kill + 8
  1   libsystem_c.dylib                    0x39054ffd abort + 76
  2   Ding Dong                            0x00090de7 uncaught_exception_handler + 27
  3   CoreFoundation                       0x2e6a524f __handleUncaughtException + 579
  4   libobjc.A.dylib                      0x38ae590f _objc_terminate() + 175
  5   libc++abi.dylib                      0x3839a1c7 std::__terminate(void (*)()) + 79
  6   libc++abi.dylib                      0x38399a1d __cxxabiv1::exception_cleanup_func(_Unwind_Reason_Code, _Unwind_Exception*) + 1
  7   libobjc.A.dylib                      0x38ae5783 objc_exception_throw + 250
  8   CoreFoundation                       0x2e6a88e7 -[NSObject doesNotRecognizeSelector:] + 202
  9   CoreFoundation                       0x2e6a71cb ___forwarding___ + 707
  10  CoreFoundation                       0x2e5f64d8 _CF_forwarding_prep_0 + 24
  11  VectorKit                            0x36077cb9 -[VKTileProvider tileSource:keyIsNeeded:] + 68
  12  VectorKit                            0x36077c2b -[VKTileSource _shouldDecodeTile:] + 178
  13  VectorKit                            0x36077a91 -[VKTileSource didFetchData:forKey:] + 108
  14  GeoServices                          0x3319a087 ___ZNK49-[GEOTileLoaderInternal _loadedTile:forKey:info:]66__49-[GEOTileLoaderInternal _loadedTile:forKey:info:]_block_invoke3$_1clERKN8LoadItem9RequesterE_block_invoke_2 + 55
  15  libdispatch.dylib                    0x38fc8d1b _dispatch_call_block_and_release + 11
  16  libdispatch.dylib                    0x38fcf273 _dispatch_queue_drain$VARIANT$mp + 375
  17  libdispatch.dylib                    0x38fcf06b _dispatch_queue_invoke$VARIANT$mp + 43
  18  libdispatch.dylib                    0x38fcfce1 _dispatch_root_queue_drain + 77
  19  libdispatch.dylib                    0x38fcff59 _dispatch_worker_thread2 + 57
  20  libsystem_pthread.dylib              0x3910adbf _pthread_wqthread + 298
  21  libsystem_pthread.dylib              0x3910ac84 start_wqthread + 8
  
  Thread 16 Crashed:
  0   VectorKit                            0x35a36476 std::__1::__hash_iterator&lt;std::__1::__hash_node&lt;std::__1::pair&lt;VKTileKey, void const*&gt;, void*&gt;*&gt; std::__1::__hash_table&lt;std::__1::pair&lt;VKTileKey, void const*&gt;, std::__1::__unordered_map_hasher&lt;VKTileKey, void const*, hashkey, true&gt;, std::__1::__unordered_map_equal&lt;VKTileKey, void const*, eqkey, true&gt;, vk_allocator&lt;std::__1::pair&lt;VKTileKey, void const*&gt; &gt; &gt;::find&lt;VKTileKey&gt;(VKTileKey const&amp;) + 54
  1   VectorKit                            0x35a3642d -[VKTileKeyMap objectForKey:] + 24
  2   VectorKit                            0x35a3a837 -[VKTileKeyList containsKey:] + 34
  3   VectorKit                            0x35a54b9f -[VKTileProvider tileMatters:] + 78
  4   VectorKit                            0x35a549c1 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 92
  5   VectorKit                            0x35a5495d -[VKTileProvider tileSource:didFetchTile:forKey:] + 60
  6   VectorKit                            0x35a54915 -[VKTileSource fetchedTile:forKey:] + 44
  7   VectorKit                            0x35a5489d -[VKTileSource _fetchedTile:] + 224
  8   VectorKit                            0x35a54409 __49-[VKTileSource decodeData:downloadKey:sourceKey:]_block_invoke_3 + 109
  9   libdispatch.dylib                    0x388780c3 _dispatch_call_block_and_release + 11
  10  libdispatch.dylib                    0x3887ce7b _dispatch_queue_drain + 375
  11  libdispatch.dylib                    0x38879f93 _dispatch_queue_invoke + 43
  12  libdispatch.dylib                    0x3887d745 _dispatch_root_queue_drain + 77
  13  libdispatch.dylib                    0x3887d9c5 _dispatch_worker_thread2 + 57
  14  libsystem_pthread.dylib              0x389a7dff _pthread_wqthread + 298
  15  libsystem_pthread.dylib              0x389a7cc4 start_wqthread + 8
  </code></pre>