2
votes

In my app, I am displaying a map with annotations, and the user can browse the list of annotations in a table view (in a modal view controller).

I am experiencing a weird bug that I can reproduce both on device and in the simulator (iOS 7 & 8).

When in pitched mode, if I try to select an item in my POI table view, it does one of these :

  • changes the map center to a random point on the map, not the selected annotation.
  • crashes with the message that I put under (NSZombies enabled).

-[__NSCFString isPitched]: unrecognized selector sent to instance 0x7f24e6e0

I tried several methods to solve this bug, but with no success. And what puzzles me is I can't find any information on the isPitched method. It isn't in my code, neither in Apple documentation.

Does someone knows more on MapKit and these types of problem ? Alternatively, would you know a way to deactivate the pitch when a user select a POI in the list ? Maybe it would prevent the bug.

screenshot

EDIT : Just found that the 'isPitched' method is actually part of VectorKit ! Doesn't really help, though. No documentation on VectorKit...

EDIT 2 : Added stack trace.

-[__NSCFString isPitched]: unrecognized selector sent to instance 0x7db84870
2015-02-28 14:25:08.501 Cartel 2015[2481:178443] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString isPitched]: unrecognized selector sent to instance 0x7db84870'
*** First throw call stack:
(
    0   CoreFoundation                      0x00afb946 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x00784a97 objc_exception_throw + 44
    2   CoreFoundation                      0x00b035c5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
    3   CoreFoundation                      0x00a4c3e7 ___forwarding___ + 1047
    4   CoreFoundation                      0x00a4bfae _CF_forwarding_prep_0 + 14
    5   VectorKit                           0x02dd09c1 __86-[VKMapCameraController _animateToPosition:pitch:yaw:duration:timingCurve:completion:]_block_invoke + 1809
    6   VectorKit                           0x02d88645 -[VKAnimation onTimerFired:] + 357
    7   VectorKit                           0x02d9895e -[VKScreenCanvas animateWithTimestamp:] + 686
    8   VectorKit                           0x02d9850e -[VKScreenCanvas updateWithTimestamp:] + 46
    9   VectorKit                           0x02d71e69 -[VKMapView onTimerFired:] + 89
    10  libobjc.A.dylib                     0x0079a771 -[NSObject performSelector:withObject:] + 70
    11  VectorKit                           0x0323463c -[GGLDisplayLink _displayLinkFired:] + 60
    12  QuartzCore                          0x041abcad _ZN2CA7Display15DisplayLinkItem8dispatchEv + 45
    13  QuartzCore                          0x041abb83 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 311
    14  QuartzCore                          0x041ac067 _ZN2CA7Display16TimerDisplayLink8callbackEP16__CFRunLoopTimerPv + 123
    15  CoreFoundation                      0x00a558d6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    16  CoreFoundation                      0x00a5525d __CFRunLoopDoTimer + 1309
    17  CoreFoundation                      0x00a146ba __CFRunLoopRun + 2090
    18  CoreFoundation                      0x00a13bcb CFRunLoopRunSpecific + 443
    19  CoreFoundation                      0x00a139fb CFRunLoopRunInMode + 123
    20  GraphicsServices                    0x03f4324f GSEventRunModal + 192
    21  GraphicsServices                    0x03f4308c GSEventRun + 104
    22  UIKit                               0x00f318b6 UIApplicationMain + 1526
    23  Cartel 2015                         0x0001110d main + 141
    24  libdyld.dylib                       0x046aaac9 start + 1
    25  ???                                 0x00000001 0x0 + 1
1
Update your question with relevant details of the stack trace from the crash.rmaddy
Done. It's not really well formatted, though.Pierre
I should have clarified that you need to post a symbolicated stack trace. But the problem is in the VKMapCameraController class.rmaddy
Consider that an NSString is being encountered where some sort of VectorKit object is expected. This means either 1) a "zombie" pointer that used to address some sort of VectorKit object is now addressing an NSString, or 2) someone provided an NSString pointer where a pointer some sort of VectorKit object was expected. You might have directly passed the wrong pointer, or set some setting that tells VectorKit to expect one of their objects vs an NSString.Hot Licks
Yes, I know it probably comes from a zombie pointer (hence the __NSCFString), but I never call any of the methods that are in the call stack, only [mapView setCenterCoordinate: annotation.coordinate animated: YES] ;. And as VectorKit doesn't seem to be public, I can't see why this isPitched method is fired and on which object.Pierre

1 Answers

2
votes

OK, I managed to prevent the crash with the following fix.

When a POI is selected in my list, I trigger a delegate method of the view controller that handles the MapView from the didSelect method of the controller of the tableView. If you have the same problem, I assume you understand what I mean, so far.

In this method, I asked the MapView to center itself on the coordinates of the POI.

Now, to solve the problem that only happened when the user tracking mode was set to "pitched" (following your orientation), I simply added a line to deactivate this tracking mode at the beginning of my method :

[mapView setUserTrackingMode: MKUserTrackingModeNone] ;

This removed the crashes that randomly appeared. Notice that it doesn't result in a counterintuitive behavior because this tracking mode is automatically deactivated when the user moves the map.

So problem solved for me but if you have any information about this isPitched selector and what really caused the problem, you're very welcome to post it here !