IOS 6 MKMapView crashes on [EAGLContext setCurrentContext]

6

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 ...
opengl-es
mkmapview
exc-bad-access
ios6
asked on Stack Overflow Sep 26, 2012 by Dincer Uyav • edited Sep 28, 2012 by ColinE

2 Answers

7

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.

answered on Stack Overflow Sep 28, 2012 by ObjectiveC-oder • edited Aug 6, 2017 by Pang
0

for those who did not work even tried [EAGLContext setCurrentContext:nil]; on dealloc, try this

dispatch_async(dispatch_get_main_queue(), ^{
        [EAGLContext setCurrentContext:nil];
    });

EAGLContext should be set on main thread.

answered on Stack Overflow Jun 9, 2016 by musixlemon

User contributions licensed under CC BY-SA 3.0