ios – 主线程上昂贵的renderInContext内存使用情况

我正在使用在主线程上执行的跟随代码截取屏幕截图(不是self.view的子视图)视图,然后在UI ImageView中显示.一切都在功能方面运行良好,但是因为这个代码是在扩展上运行的,所以存在更严格的内存界限(我读过~30 MB是上限?),
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.screenshotView.frame.size.width,self.screenshotView.frame.size.height-2),YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.screenshotView.layer renderInContext:context];
_generatedImage = UIGraphicsGetimageFromCurrentimageContext();
UIGraphicsEndImageContext();

self.previewImageView.image = _generatedImage;

只要按下UIButton,就会使用performSelectorOnMainThread调用代码所在的方法.还提供了一个UIAlertController来处理UI的冻结,但是如果连续按下按钮(在解除UIAlertController之后),前几次内存使用将保持在基线附近(~15 MB),但随后加入到〜30 MB并保持在那里,直到几秒钟后再次调用方法,然后当它完成渲染时,它会回落到~15 MB.

我不确定是什么导致了这种行为,为什么内存使用不会一直保持在15 MB左右,而且我不确定当连续调用方法时它会出现什么样的情况.听起来更像是有时会发生一件事吗?我怎样才能确保不会发生这种情况,只有在可以安全再次渲染而不增加内存使用量时才会解除UIAlertController.

解决方法

内存峰值不是由于renderInContext:调用,尽管包括指向它的乐器在内的一切,但它是由于捕获的UIView的子视图.在我的情况下,它是一个错误的约束导致UITextView将其高度设置为2000.

对于任何有这样的问题并且无法弄明白的人,请从renderInContext继续:查看您的子视图以确保它们正确.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...