在后台线程目标C renderInContext崩溃(objective c renderInCon

2019-08-17 05:40发布

我有一个应用程序在屏幕不断在后台线程捕捉。 下面是代码

- (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;
}

它的工作原理很好的捕捉一次或两次。 但过了一段应用程序崩溃总是在同一行后[[keyWindow layer] renderInContext:context]; 和它给EXC_BAD_ACCESS (code=1, address=0x8)消息。 我搜索无处不在,没有什么用处。 发现只有renderInContext有内存泄漏问题,当它工作在后台线程。 但是当你明白,不解决我的问题:)。 因此,有3个问题: -

  1. 这是什么崩溃(问题)的原因是什么?

  2. 我能有什么用呢?

  3. 是否有任何其他的方式来捕捉屏幕(苹果暗示一个旁边,因为这里还使用renderInContext)。 不事渲染...?

Answer 1:

-renderInContext:不是线程安全的,你不能从一个后台线程调用它。 你必须做在主线程绘图。



Answer 2:

我什么都没有做,但在执行上的主线程此方法。 我改组我的线程管理和能取得良好的效果,我这样做:

[self performSelectorOnMainThread:@selector(captureScreenOnMainThread) withObject:nil waitUntilDone: YES]; 最后一个参数可以设置为没有在某些情况下...

感谢所有的反应。



文章来源: objective c renderInContext crash on background thread