我有一个应用程序,其中屏幕连续捕获后台线程。这是代码
- (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个问题: -
这次崩溃的原因是什么(问题)?
我该怎么办?
是否有其他方法可以捕获屏幕(在Apple建议的旁边,因为还使用了renderInContext)。没有渲染的东西......?
答案 0 :(得分:8)
-renderInContext:
不是线程安全的,你不能从后台线程调用它。你必须在主线程上进行绘图。
答案 1 :(得分:3)
除了在主线程上执行此方法之外,我无所事事。我重新组织了我的线程管理,并且可以为我做到这一点得到很好的结果:
[self performSelectorOnMainThread:@selector(captureScreenOnMainThread) withObject:nil waitUntilDone: YES];
在某些情况下,最后一个参数可以设置为否...
感谢所有回复。