Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

objective c renderInContext crash on background thread

I have an app in which the screen continuously is capturing in background thread. Here is the code

- (UIImage *) captureScreen {

    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    CGRect rect = [keyWindow bounds];
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[keyWindow layer] renderInContext:context];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    UIDeviceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight) || (orientation==UIInterfaceOrientationPortraitUpsideDown)) {
        img=[self rotatedImage:img];
    }
    return img;
}

It works good for capturing once or twice. But after a while the app crashes always on the same line [[keyWindow layer] renderInContext:context]; and it gives EXC_BAD_ACCESS (code=1, address=0x8) message. I searched everywhere and nothing useful. Found only that renderInContext has memory leak issue when it works in background thread. But as you understand that doesn't solve my issue :) . So have 3 questions :-

  1. What is the reason of this crash (problem)?

  2. What can I do with this?

  3. Is there any other way to capture screen (beside the one that Apple suggests, because there renderInContext is also used). Something without rendering...?

like image 612
Garnik Avatar asked Feb 28 '13 12:02

Garnik


2 Answers

I had nothing to do but performing this method on main thread. I reorganized my thread management and could get good result for me doing this:

[self performSelectorOnMainThread:@selector(captureScreenOnMainThread) withObject:nil waitUntilDone: YES]; Last parameter can be set to no in some cases...

Thanks for all responses.

like image 20
Garnik Avatar answered Oct 07 '22 13:10

Garnik


-renderInContext: is not thread-safe and you can't call it from a background thread. You'll have to do the drawing on the main thread.

like image 92
Fabian Kreiser Avatar answered Oct 07 '22 12:10

Fabian Kreiser