5

我有一个应用程序,其中屏幕在后台线程中连续捕获。这是代码

- (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. 有没有其他方法来捕获屏幕(除了Apple建议的方法,因为还使用了renderInContext)。没有渲染的东西......?

4

2 回答 2

8

-renderInContext:不是线程安全的,您不能从后台线程调用它。您必须在主线程上进行绘图。

于 2013-02-28T12:19:10.930 回答
3

除了在主线程上执行此方法外,我无事可做。我重新组织了我的线程管理,这样做可以得到很好的结果:

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

感谢所有回复。

于 2013-04-25T09:11:40.740 回答