使用initWithBitmapDataPlanes创建NSImage时的Cocoa内存管理

spa*_*ygw 6 cocoa objective-c nsimage

我正在使用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];
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我后来在"数据"中写了更多东西,我知道NSImage并没有复制它.我这样说是因为如果我稍后将所有0写入我的数据缓冲区,那么图像全黑.

我正在与Objective C挣扎,所以如果这是微不足道的话请耐心等待.

如果我制作一份"数据"的本地副本并且永远不会释放它,那么事情就会很好,但显然会泄漏:

unsigned char *copy_of_data = new unsigned char[len];
memcpy(copy_of_data, data, len);
Run Code Online (Sandbox Code Playgroud)

我怎么能:

(1)使initWithBitmapDataPlanes创建自己的副本并处理deallocation?

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

Ken*_*ses 6

也许,最简单传递NULLplanes参数.然后,在分配并初始化图像代表之后,请求它并将其-bitmapData复制到其中.这种方法在文档中提出:

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

强调补充说.