Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS 6 MKMapView crashes on [EAGLContext setCurrentContext]

We are developing an iPad application starting from map view with annotations.

By using storyboard when We switch to another view which has an opengl based charting solution (shinobi). On return to the view with map it has no problem until a touch on the map to move it. As we try to move map it crashes with exc_bad_access exception at [EAGLContext setCurrentContext]

Any ideas?

Here is the part of the crash log:

OS Version:      iOS 6.0 (10A403)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000c
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   OpenGLES                        0x39974b12 +[EAGLContext setCurrentContext:] + 74
1   VectorKit                       0x32c64f0c -[VGLGPU setPaused:] + 120
2   VectorKit                       0x32c54db8 -[VKMainLoop updateLinkState] + 492
3   VectorKit                       0x32c54950 -[VKScreenCanvas _updateDisplayStatus:] + 104
4   VectorKit                       0x32ccea9a -[VKScreenCanvas setGesturing:] + 254
5   MapKit                          0x34defc3c -[MKMapView _willStartUserInteraction] + 48
6   MapKit                          0x34de891a -[MKMapGestureController beginGesturing] + 50
7   MapKit                          0x34de8c6c -[MKMapGestureController handlePan:] + 252
8   UIKit                           0x379ead2c _UIGestureRecognizerSendActions + 124
9   UIKit                           0x379b23d8 -[UIGestureRecognizer _updateGestureWithEvent:] + 388
10  UIKit                           0x37b9f474 ...
like image 309
Dincer Uyav Avatar asked Sep 26 '12 13:09

Dincer Uyav


1 Answers

I work for Shinobi and we've been investigating this - it's partly due to Apple's map code keeping hold of our GL-Context. As a temporary workaround, you can create a subclass of a ShinobiChart and nil-out the GL context in the chart's dealloc method, like so:

- (void) dealloc {
    [super dealloc];

    [EAGLContext setCurrentContext:nil]; // must be after dealloc
}

or if you're using ARC, (since sending dealloc is not allowed):

#import <ShinobiCharts/SChartCanvas.h>

@interface ShinobiChartGl : ShinobiChart
@end

@implementation ShinobiChartGl

- (void) dealloc
{
    [self.canvas.glView removeFromSuperview];

    self.canvas.glView = nil; // force glView dealloc

    [EAGLContext setCurrentContext:nil];
}

@end

Hope this helps, but do contact us directly - we'll have a full fix out in our next release.

like image 71
ObjectiveC-oder Avatar answered Oct 31 '22 20:10

ObjectiveC-oder