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];
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[keyWindow layer] renderInContext:context];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();


    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 :-

  • How to make the union between two MKCoordinateRegion
  • UITableView with infite scrolling and lazy loading
  • NSUndoManager to undo UIImage rotation using rotation gesture
  • How to detect touches on UIImageView of UITableViewCell object in the UITableViewCellStyleSubtitle style
  • Error “No known class method for selector 'Hello:'” in custom-made framework
  • Possible to save an integer array using NSUserDefaults on iPhone?
    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…?

    2 Solutions Collect From Internet About “objective c renderInContext crash on background thread”

    -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.

    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.