【发布时间】:2023-04-07 05:00:01
【问题描述】:
我有一个应用程序,其中屏幕在后台线程中连续捕获。这是代码
- (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)。没有渲染的东西...?
【问题讨论】:
-
你应该在主线程上执行你的 GUI 相关任务
-
向我们展示您的渲染代码。您是否尝试在未创建它们的线程中使用核心数据对象。您是否在渲染代码中使用非原子属性。这两个和更多都可能导致这种情况。
-
在调用
renderInContext时,layer或context中的任何一个是否为零?是否调用了receivedMemoryWarning方法? -
@WarrenBurton 我正在编写一种库,因此我的代码不能仅基于主线程。我还有另外两个线程,一个用于捕获另一个用于发送图像。所以是的,也许我正在使用在主线程中创建的核心数据对象。你也能解释一下为什么非原子属性在这里如此重要吗???
-
@ott-- 我不确定层和上下文 cz 尚未检查...但在某些情况下,当崩溃发生时,我会收到“收到内存警告”消息,在某些情况下我不会不。还在尝试... :(
标签: ios cocoa-touch cgcontext screen-capture mainwindow