【问题标题】:CGContextRef created with CGBitmapContextCreate() & underlying bitmap memory management使用 CGBitmapContextCreate() 和底层位图内存管理创建的 CGContextRef
【发布时间】:2017-11-23 06:49:55
【问题描述】:

我正在尝试习惯 iOS 的 CGContextRef 图形上下文,但无法找到以下问题的答案。

当您使用CGBitmapContextCreate() 创建位图上下文时,您可以选择在其data 参数中传递预分配的缓冲区或NULL。第二种情况:

如果您希望此函数为位图分配内存,请传递 NULL。 这使您无需管理自己的内存,从而减少内存 泄漏问题。

好的,这似乎是一个很好的方法。但苹果的文档缺少的是对以下时刻的清晰解释:

  • 什么时候在您将NULL 传递给CGBitmapContextCreate() 的情况下,data 缓冲区会被释放?当你发生这种情况是否正确 使用CGContextRelease()释放上下文?
  • 相反,当您将指针传递给预分配的缓冲区时 到CGBitmapContextCreate()是否安全假设在调用之后 CGContextRelease(),您仍然有有效的(在某些情况下没有损坏 方式)位图在你的缓冲区?或者您不能CGContextRelease() 调用之后使用生成的位图?

有经验的人可以分享他们对这件事的了解吗?

【问题讨论】:

    标签: ios objective-c iphone memory-management bitmap


    【解决方案1】:

    如果你没有创建缓冲区(传递 NULL),它会在你释放上下文时被它的创建者释放..

    如果您创建并传递一个缓冲区,您有责任在释放上下文后释放它。上下文只是写入和读取该缓冲区的抽象,释放它不会影响缓冲区中的数据,您的位图数据仍在缓冲区中。例如,您应该能够通过从缓冲区中创建第二个位图上下文并将其保存到文件中来轻松验证这一点。

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2012-02-22
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多