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

前端之家收集整理的这篇文章主要介绍了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继续:查看您的子视图以确保它们正确.

猜你在找的iOS相关文章