【问题标题】:What is CG Raster Data?什么是 CG 栅格数据?
【发布时间】:2012-09-12 06:17:31
【问题描述】:

我试图在我的代码中找到另一个内存泄漏,但我似乎无法弄清楚 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];

慢慢追踪……

【问题讨论】:

  • 你有没有想过这个问题?我在 iOS 7 中仍然遇到这个问题。
  • 这有什么更新吗? @丹尼尔

标签: objective-c ios memory-leaks instruments core-text


【解决方案1】:

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

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

【讨论】:

  • 我似乎遇到了一个非常相似的问题。您能详细说明将图像放入 NSCache 的问题吗?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    简而言之:如果您发现 CG 光栅数据存在内存泄漏,请查看可能包含视图的视图控制器,并确保它们正在被释放。

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 如何清除所有图片?表示image = nil?或self.view = nil?
      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        这不是一个很大的答案,但只是为了有人开始调查......

        我认为 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 图像内存非常高,所以它可能需要做带有核心动画和视图布局。

        【讨论】:

        • “CG 图像”仍然存在是 iOS 6,至少在我的应用程序中。
        • 是的,对我来说也是如此,虽然它的痕迹非常小……而在 iOS 5 中它大约为 20 mb,在 iOS 6 中最大为 32 kb。所以无论 CG Image 是什么,它在 iOS 6 中都没有发挥那么大的作用
        猜你喜欢
        • 2016-04-05
        • 2010-09-10
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多