关于使用renderInContext函数后,出现low memory warning解决方法

为了epub阅读器的新需求--仿真翻页,需要使用函数renderInContext进行截屏,然后做仿真特效。当功能实现之后,在用iPad进行功能测试的时候,发现当翻页次数到10页左右(在iPhone上测试是翻页30次才会出现内存警告,原因在于iPhone上面的屏幕截图比iPad的截图小),系统发出low memory warning(低内存警告),而且当警告次数达到一定数量,系统就会直接终止你的程序,而且没有任何异常抛出。具体有关低内存警告的知识,可以移步此博客http://www.cnblogs.com/smileEvday/archive/2012/03/07/memorywarning.html

对于低内存警告问题,我第一反应是程序是否出现内存泄露。于是用Instrustment进行调试,结果并没有发现内存泄露。但是,程序的内存监控显示内存的使用量的确在大幅度增加,而且当内存使用达到200MB左右时,系统就会发出低内存警告. 既然没有出现内存泄露,但是内存又在不断增加,那么可以推断程序持有内存,且没有及时释放。最后,通过调试,发现每一次翻页导致内存大幅增加的罪魁祸首就是renderInContext函数。

renderInContext是苹果提供的函数,用于渲染layer到Core Graphic上下文,然后转换成图片。初步猜测,当使用了renderInContext之后,系统并没有及时释放相关的内存。如果调用次数不频繁,那应该没有不允许程序正常运行。反正,则导致内存大幅增加,出现低内存警告。

在stackoverflow上有类似的提问,并且给出了解决方法,如下所示:

//渲染

    [selectView.layerrenderInContext:UIGraphicsGetCurrentContext()];

//清空缓存

selectView.layer.contents = (id)nil;


遗憾的是,由于我使用的是UIWebView,因此这个解决方法对于我的情况没有用。查找了很多资料,发现解决的方法都与上述方法大同小异。为此,我不得自己探索解决方法。虽然上述方法没有用,但是我觉得其原理应该是没有错,即只要把视图的层清空,就能及时释放内存。由于UIWebView的特殊性,直接将其layer赋值为空,达不到效果。

于是,换一种思路。UIWebView本质上就是一个小型浏览器,通过加载Url或者html文件的方式来设置并显示内容。于是,就有了下面的解决方法:

[(UIWebView *)selectView loadHTMLString:nilbaseURL:nil];

通过测试,发现这个方法有效可行,能及时释放系统占用的内存。

为了解决这个问题,前后一共耗费了一个星期的时间,期间尝试了很多方法,都没有解决问题。为了让遇到类似问题的同志们少走弯路,觉得还是很有必要分享一下。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值