使用“unsigned char”指向原始数据缓冲区时需要了解内存管理

Posted

技术标签:

【中文标题】使用“unsigned char”指向原始数据缓冲区时需要了解内存管理【英文标题】:Need to understand memory management when using "unsigned char" to point to raw data buffer 【发布时间】:2011-02-10 23:35:17 【问题描述】:

我的问题在下面的代码中。我想了解在“unsigned char”指针方面是否存在“保留”之类的东西。请解释一下。

// MyObject.h

@interface myObject : NSObject 

    unsigned char   *myData;


// MyObject.m

-(void)makeNewData


    if (myData)  free(myData); 
    myData = [self createBitmapContextData:myCGImageRef];

    //Here is my question: do I need a "retain" call equivalent on the next line?
    //[myData retain];



- (unsigned char*)createBitmapContextData:(CGImageRef)fromImage


    CGContextRef cgctx = [self createARGBBitmapContextFromImage:myCGImage];
    if (cgctx == NULL)  return nil; 

    size_t w = CGImageGetWidth(myCGImage);
    size_t h = CGImageGetHeight(myCGImage);
    CGRect rect = 0,0,w,h; 

    CGContextDrawImage(cgctx, rect, myCGImage); 

    unsigned char* data = CGBitmapContextGetData (cgctx);

    CGContextRelease(cgctx);

    return data;


【问题讨论】:

NSData 是原始缓冲区的对象包装器。会这样吗? @macross 可能,我需要更多帮助。假设我这样做:NSData *myNSData = [[NSData alloc]initWithBytes:data length:sizeof(data)]; 如何使用 NSData 访问 data[index] 【参考方案1】:

不,没有“保留”原始指针这样的事情。

正如 mackross 所说,NSData 可用于在您自己分配数据时保留数据。但是,在这种情况下,您并不拥有数据,您只是从拥有它的CGContext“获取”它。当CGContext 发布时,您的参考将失效。在这种情况下,您需要拥有对上下文的引用,直到不再需要指针为止。

【讨论】:

谢谢。这正是我需要理解的部分。

以上是关于使用“unsigned char”指向原始数据缓冲区时需要了解内存管理的主要内容,如果未能解决你的问题,请参考以下文章

将 unsigned char* 缓冲区分配给字符串

有没有合法的方法将 unsigned char 指针转换为 std::byte 指针?

将 unsigned char 缓冲区与 node-ffi 一起使用

unsigned char 到 8 个原始位的 unsigned char 数组

指向较大 unsigned char 数组的每个第 n 个元素的指针数组

SWIG 将 unsigned char* 转换为 20 字节缓冲区 Java 结构