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

7 memory rendering objective-c ios uigraphicscontext

我正在使用在主线程上执行的跟随代码来截取屏幕截图(不是self.view的子视图)视图然后显示在UIImageView.一切都在功能方面运行良好,但是因为这个代码是在扩展上运行的,所以存在更严格的内存界限(我读过~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;
Run Code Online (Sandbox Code Playgroud)

performSelectorOnMainThread无论何时UIButton按下,都会调用此代码所在的方法.A UIAlertController也用于处理UI的冻结,但是如果连续按下按钮(在解除之后UIAlertController),前几次内存使用将保持在基线附近(~15 MB),但随后加速到~30 MB并保持在那里,直到几秒钟后再次调用该方法,然后当它完成渲染时,它会回落到~15 MB.

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

小智 3

内存峰值并不是由于调用(renderInContext:尽管包括指向它的仪器在内的所有内容)引起的,而是由于subviews捕获的UIView. 就我而言,这是一个错误的约束,导致 aUITextView将其设置height2000

对于遇到这样的问题并且无法解决的人,请继续renderInContext:查看您的子视图以确保它们是正确的。