26

我试图在我的代码中找到另一个内存泄漏,但我似乎无法弄清楚 CG Raster Data 是什么。在通过启用自动快照的 VM Tracker 时,CG 栅格数据似乎是唯一增加的部分。这些也稳步增加,而分配没有增加。

我不完全确定 CG Raster Data 是什么,也不知道如何修复它,但是在这一点上,不断增加的占用空间最终会导致内存错误和崩溃,所以这不好!我自己进行文本渲染(使用 CoreText),所以我认为这与它有关。我也在加载图片?

下面是足迹的图像: 页面加载时分配的峰值(应用程序加载带有图像和文本的页面),但脏内存总是增加。

更新: 这个问题仍然存在,但有趣的是,我可以将它与 UIFoundations 中的泄漏关联到称为“NSConcreteGlyphGenerator”的东西。似乎只有当我在实际绘制的 CoreText 方法中的属性字符串上调用“boundingRectWithSize:”方法时才会发生这种情况。具体来说,这条线是:

[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];

慢慢追查...

4

6 回答 6

12

我不知道“CG 光栅数据”可能包含的所有内容,但我确定它包含的一件事是……Core Graphics 分配的内存来存储光栅数据,也就是位图。

具体来说,在我的应用程序中,我使用CGBitmapContextCreate. NULL我作为参数传递data,以便 Core Graphics 为我分配位图内存。每像素 32 位(4 字节)的 256x256 位图需要 256 KiB = 64 页,每页 4 KiB。在 Instruments 中,我得到两个“CG 栅格数据”块,每个块 65 页。如果我注释掉其中一个位图上下文,我只会在 Instruments 中得到一个 65 页的“CG 栅格数据”块。

另一方面,我的CATiledLayer应用程序中也有一个。它设置了自己的图形上下文供我绘制,我相信它使用窗口服务器(在 iOS 5 上,在 iOS 6 上)也直接访问CATiledLayer的共享内存创建这些上下文。我没有看到任何与这些图形上下文相对应的“CG 栅格数据”块。springboardbackboard

于 2012-09-29T04:41:02.677 回答
2

通过简单地反复推送和弹出视图控制器,我遇到了与 CG 光栅数据内存增加相同的问题。我花了一段时间认为这是一些绘图代码的问题。我终于把它追踪到一个没有弱引用被推送和弹出的视图控制器的委托,所以当我弹出视图控制器时,它没有被释放。CG 栅格数据恰好是该视图控制器占用空间的最大部分,所以我错误地将问题归咎于最初的问题,当时实际上是视图控制器本身没有被释放(因此,没有释放它的视图,一些其中有 CG 栅格数据)。

简而言之:如果您看到 CG Raster Data 的内存泄漏,请查看可能有视图的视图控制器,并确保它们正在被释放。

于 2015-03-05T13:11:02.037 回答
1

这不是一个答案,但只是有人开始调查......

我认为 CG Raster Data 在 iOS 6 中是新的,但在 iOS 5 中作为 CG Image 存在。我在两个模拟器上测试过,在 iOS 5 上,CG Raster Data 不存在,但是如果你比较 iOS 6 和 iOS 5 上的总量,CG Image 几乎等于 CG Raster Data,而 CG Image 不出现在 iOS 6 上。所以我很确定他们只是将 CG Image 重命名为 CG Raster Data。

至于 CG Image 到底是什么,那么几个月来我一直试图弄清楚这一点。我认为这只是系统处理的视图布局相关的事情,你并没有真正控制,因为我的应用程序实际上没有任何 UIImages 或 CG 图像,而且我的 CG 图像内存非常高,所以它可能需要做使用核心动画和视图布局。

于 2012-09-29T03:08:22.423 回答
1

如果您担心内存使用(89MB)有点。您是否尝试过在模拟器中模拟内存警告(模拟器 > 硬件 > 模拟内存警告)?

我的猜测是图片图像占用了内存。

您可能需要通过观察内存警告消息来释放图像:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

清除handleMemoryWarning方法中的所有图像对象。

于 2014-09-02T07:14:13.047 回答
1

当我遇到这个问题时,“CG 光栅数据”来自我从 UIGraphicsBeginImageContextWithOptions 调用 UIGraphicsGetImageFromCurrentImageContext 创建的图像。我花了一天时间才找到问题所在,最后它与图像的制作方式完全无关。在我的情况下,我在代码的另一部分无意中将图像粘贴到了我自己的 NSCache 中,而没有意识到这一点。

如果您遇到 CG 栅格数据未发布的问题,您应该考虑创建数据的来源很可能与真正的问题没有任何关系。可能是图像数据只是在您不期望的情况下被保留,而您在 Instruments 中看到的“CG Raster Data”标签只是指数据的来源。您应该检查以确保您没有在 removeFromSuperview (例如 UIImageViews )失败时执行多个 addSubviews 之类的操作,或者将图像放入缓存、数组、强变量等。

于 2016-03-25T23:28:08.340 回答
0

不是真正的答案。但是我在解决 CG-raster-data-leak 时发现了更多提示:

  • cg-raster-data 保存 CGIMageRefs 的内存(至少从 CGBitmapContextCreateImage() 从 CGBitmapContextCreate(NULL, ...) 创建的上下文中创建
  • 我的泄漏是缺少 CGImageRelease()。我使用图像作为 CALayer 的内容传递,并假设此属性包含引用。但似乎这个任务复制了图像。至少我在分配后立即调用 CGImageRelease 没有问题。

希望对某人有所帮助...

于 2015-09-09T11:02:44.110 回答