【问题标题】:How to release this?如何释放这个?
【发布时间】:2010-09-23 09:08:34
【问题描述】:

我正在创建一个位图上下文,在我的代码中有这样的:

bitmapData = malloc(bitmapByteCount);

context = CGBitmapContextCreate (bitmapData,
                                     pixelsWidth,
                                     pixelsHeight,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedFirst);

在方法返回CGContextRef对象之前,我想我必须释放bitmapData。在返回context 之前,我可以安全地拨打free(bitmapData) 吗?

【问题讨论】:

    标签: iphone core-graphics


    【解决方案1】:

    CGBitmapContextCreate 的文档是这样说的:

    在 iOS 4.0 及更高版本以及 Mac OS X 中 v10.6 及更高版本,您可以传递 NULL if 你想让 Quartz 分配内存 位图。这让你从 管理自己的记忆, 减少内存泄漏问题。

    我建议你传递 NULL 而不是 malloc 的指针,这样你就不用担心它的内存了。

    但是,请注意CGBitmapContextCreate 的名称中包含“create”,因此按照惯例,您将拥有返回的对象。您需要在某个时候使用CFRelease() 发布此内容。

    【讨论】:

    • 实际上不是相反吗?如果方法名称中有“create”,则必须自动释放它,这样接收者就不必担心内存管理。只有当它在方法名称中是“新的”或“alloc”时,您必须手动释放。至少那是我学到的;)
    • 这个问题:stackoverflow.com/questions/870243/… 解释了关于在 Core Foundation 中释放对象的一些事情。 Core Foundation 中没有自动释放的概念。
    • 从我链接的那个问题的答案中:“由于 Core Foundation 中没有自动释放等效项,如果您从方法返回引用,请返回数组而不释放它。您应该(除非你是邪恶的)然后在方法名称中包含“create”以向调用者表明他们现在拥有对返回对象的引用。”
    • openfrog:你在考虑方法。 CGBitmapContextCreate 是一个函数。此外,由于它在 Core Graphics 中,因此它遵循 Core Foundation 内存管理规则(几乎相同,只是 Create 而不是 new/alloc 并且没有自动释放)。 developer.apple.com/mac/library/documentation/CoreFoundation/… 基本真理保持不变:无论以何种方式拥有上下文,都必须释放它。
    【解决方案2】:

    如果您正在为 iOS 4.0 或更高版本进行开发,Jasarien 的答案是最好的。如果您想支持旧版本,请继续阅读。

    只要使用上下文,就必须保留 bitmapData。如果您尝试在位图上下文中绘制并且您已经释放了 bitmapData,那么将会发生坏事。最好的解决方案是在上下文中调用 CFRelease 后释放 bitmapData。如果您调用 CGBitmapContextCreateImage 从位图上下文中提取 CGImage,请不要担心...当您释放位图上下文时,CGImage 将制作自己的位图数据副本。

    这意味着创建一个创建和返回位图上下文的方法或函数可能不是最好的主意。如果可以,最好在方法的顶部创建上下文,在该方法中使用它,然后在方法结束时释放上下文并释放位图。如果您不能这样做,请考虑将上下文及其 bitmapData 存储在 ivars 中。如果您一次需要多个位图上下文,您可能需要创建一个对象来跟踪上下文及其位图上下文。

    这就是为什么如果您只支持 iOS 4.0 或更高版本,最好为 bitmapData 传递 NULL。如果您在 4.0+ 上并传递 NULL,您可以放心地忽略我上面所说的内容,并确保调用者最终在您返回的上下文中调用 CFRelease。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 2022-11-10
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多