【问题标题】:Cocoa memory management when using initWithBitmapDataPlanes to create NSImage使用 initWithBitmapDataPlanes 创建 NSImage 时的 Cocoa 内存管理
【发布时间】:2013-04-18 23:25:28
【问题描述】:

我正在从 24 位 RGB 数据的 unsigned char * 创建一个 NSImage,如下所示:

NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc]
                            initWithBitmapDataPlanes:(unsigned char **)&data
                            pixelsWide:gWidth
                            pixelsHigh:gHeight
                            bitsPerSample:8
                            samplesPerPixel:3
                            hasAlpha:NO
                            isPlanar:NO
                            colorSpaceName:NSCalibratedRGBColorSpace
                            bytesPerRow:gWidth*3
                            bitsPerPixel:24];

NSImage *img = [[NSImage alloc] initWithSize:NSMakeSize(gWidth, gHeight)];
[img addRepresentation:bitmap];

我遇到的问题是我稍后会向“数据”写入更多内容,并且我知道 NSImage 不会复制它。我这么说是因为如果我稍后将全 0 写入数据缓冲区,那么图像就会全黑。

我在 Objective C 上苦苦挣扎,如果这是微不足道的,请耐心等待。

如果我制作了“数据”的本地副本并且从不释放它,那么一切都会很好,但显然会泄漏:

unsigned char *copy_of_data = new unsigned char[len];
memcpy(copy_of_data, data, len);

我该怎么做:

(1) 让 initWithBitmapDataPlanes 创建自己的副本并处理释放?

或 (2) 在图像不再需要数据后,在适当的时候自行释放数据?

【问题讨论】:

    标签: objective-c cocoa nsimage


    【解决方案1】:

    NULL 传递给planes 参数可能是最简单的。然后,在图像代表被分配和初始化后,向它询问其-bitmapData 并将您的数据复制到其中。文档中建议使用此方法:

    如果 planes 为 NULL 或 NULL 指针数组,此方法分配 足够的内存来保存其他参数描述的图像。 你 然后可以获得指向该内存的指针(使用 getPixel:atX:y: 或 bitmapData 方法)并填充图像数据。 在这种情况下, 分配的内存将属于该对象,并在它被释放时被释放 释放。

    添加了重点。

    【讨论】:

    • 哦!我错过了。我会试一试,看看它是否有效。
    【解决方案2】:

    根据docs hereNSBitmapImageRep 将不会获得平面数据的所有权,如果它在您传入时是有效的。(“当对象本身被释放时,它不会尝试释放缓冲区。” )。

    所以你只能靠自己了。最简单的方法是将指向数据的指针与指向图像代表的指针放在一起,当一个被释放时,释放另一个。 (即,如果它们作为 ivars 保存或临时使用。)如果您使用 GC,这可能会更难。

    最干净的是,您还可以创建一个小型包装类,它同时拥有图像表示对象和数据指针,并在该对象的-finalize(或-dealloc)中删除数据缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多