我试图找到我的代码中的另一个内存泄漏,我似乎无法找出CG光栅数据。 虽然经历的VM跟踪启用自动快照,该CG栅格数据似乎是增加的唯一部分。 这些也在稳步增加,却没有拨款增加。
我不能完全肯定的CG栅格数据是什么,也不是我会怎么解决这个问题,但在这一点上增加足迹最终会导致内存错误和崩溃,所以它不是好! 我做我自己的文字渲染(使用CoreText),所以我在想,有什么用它做。 我也是加载图片?
下面是足迹的图像:
更新:这个问题仍然存在,但有趣的是,我可以将其与UIFoundations一种叫做内漏“NSConcreteGlyphGenerator。” 似乎只有当我称之为“boundingRectWithSize:”发生的方法在实际绘制CoreText方法的属性串。 行,具体而言,是:
[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];
慢慢地跟踪下来...
我不知道,“CG栅格数据”可能包含一切,但有一件事我知道肯定它包含是核芯显卡分配给存储栅格数据,又名位图...内存。
具体而言,在我的应用程序,我使用两台256×256位的上下文CGBitmapContextCreate
。 我通过NULL
作为data
参数,使核芯显卡分配内存位图对我来说。 256x256的位图,每像素32位(4个字节)取256 KIB = 64个页面的每个的4 KiB的。 在仪器,我得到两个“CG栅格数据”的每一页65块。 如果我注释掉那些位图上下文之一,我得到的只是一个65页的“CG栅格数据”在仪表块。
在另一方面,我也有一个CATiledLayer
我的应用程序。 该CATiledLayer
设置自己的图形上下文为我画成,我相信它使用共享内存窗口服务器(创建这些情境springboard
上的iOS 5, backboard
上的iOS 6)也直接访问。 我没有看到相应的图形上下文任何“CG栅格数据”块。
我曾与CG栅格数据存储只需简单地推,反复弹出一个视图控制器增加了同样的问题。 我花了一段时间,认为这只是一些绘图代码的问题。 我终于跟踪它到委托不弱引用正被压入和弹出视图控制器,所以,当弹出我的视图控制器,它没有被释放。 该CG栅格数据恰巧是视图控制器的足迹中最大的一部分,所以我错误地将原因归结到最初,当它是真的视图控制器本身没有被释放(因此,不释放其观点,一些其中有CG栅格数据)。
简而言之:如果你看到与CG栅格数据内存泄漏,看看那可能享有与他们,并确保他们在被释放视图控制器。
这不是太多的答案,但只是让别人得到调查开始...
我认为CG光栅数据是新与iOS 6,但本在IOS 5为CG图像。 我在两个仿真测试,并在iOS 5,CG栅格数据是不存在的,但如果你比较在iOS 6和iOS 5的总金额,CG图片只是等于CG栅格数据,以及CG图像不显示在iOS 6,所以我敢肯定,他们只是改名CG图片,以CG栅格数据。
至于什么CG图像确实是,好,我一直在试图找出答案了好几个月。 我认为它只是查看系统处理布局相关的东西,你真的不控制,因为我的应用程序并没有真正有任何UIImages或CG图片,我的CG图像记忆是相当高的,所以它可能是事做与核心动画和视图布局。
如果你关心的内存使用量(89MB)是位。 您是否尝试过在模拟器(模拟器>硬件>模拟内存警告)模拟内存警告?
我的猜测是它的内存画面图像用完。
有可能到头来你可能需要通过观察内存警告讯息要解除您的图片:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
在清除所有图像对象handleMemoryWarning
方法。
当我有这个问题,在“CG栅格数据”从我从一个UIGraphicsBeginImageContextWithOptions内UIGraphicsGetImageFromCurrentImageContext通话产生的图像来。 我花了一天的跟踪问题,以及它到底是不相关的图像是如何在所有做。 在我来说,我无意中粘在图像到我自己的NSCache在代码的另一部分,没有意识到这一点。
如果您正在使用CG栅格数据没有被释放有一个问题,你应该考虑的是,数据的创建,其中很可能没有任何与现实问题的根源。 这可能是当你不希望它是,和“CG栅格数据”标签,你在仪器看到的是单指数据源自哪里,图像数据被简单地被保留。 你应该检查,以确保你没有做这样的事情多addSubviews而未能removeFromSuperview(与UIImageViews的举例),或者把图像转化为高速缓存,阵列,强大的变量,等等。
不是一个真正的答案。 但一些迹象表明我想通了,而解决我的CG-栅格数据泄漏:
- 在CG-光栅数据保存CGIMageRefs的存储器(至少从CGBitmapContextCreateImage()从由CGBitmapContextCreate创建的上下文中创建(NULL,...)
- 我的泄漏是一个缺少CGImageRelease()。 我使用的图像通过作为CALayer的内容和假定该属性保存的参考。 但似乎这种分配复制图像。 至少我有分配权后调用CGImageRelease没有问题。
希望可以帮助别人...