NSMutableData字节无复制的问题

3
我正在尝试编写一个代码,以从malloced缓冲区创建NSMutableData。我使用了freewhendone = YES
1)在创建NSData后访问缓冲区会出错。(在下面的代码中的memset中)
2)malloc的缓冲区指针和[data bytes]指针不同。
这是什么原因呢?
UWORD8 *rgb_buffer = malloc(u4_stride * u4_height * 3);

NSMutableData *rgbData = [NSMutableData dataWithBytesNoCopy:rgb_buffer

                                                     length:(u4_stride * u4_height * 3)

                                               freeWhenDone:YES];
memset(rgb_buffer, 0, (u4_stride * u4_height * 3));

你可能正在使用ARC,并且在memset之后没有使用rgbData对象;因此,它可能会提前释放对象,从而释放rgb_buffer。请参见http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes/。 - iccir
1个回答

3

来自二进制数据编程指南

NSMutableData响应dataWithBytesNoCopy:length:方法,但是字节仍然被复制并且缓冲区立即被释放。

在创建NSData后访问缓冲区会产生错误。(在下面的代码中的memset函数)

缓冲区立即被释放。

malloc分配的缓冲区指针和[data bytes]指针是不同的。

NSMutableData会创建字节的副本。


如果您希望在释放对象时不复制或释放字节,则可以使用dataWithBytesNoCopy:length:freeWhenDone:或initWithBytesNoCopy:length:freeWhenDone:方法,并将freeWhenDone:参数传递为NO。这意味着使用此方法不应复制字节。当我尝试使用freewhendone = NO进行此操作时,memset不会导致segfault,但指针仍然不同。 - thar_bun
1
NSMutableData也响应这些方法,但是字节仍然被复制,并且缓冲区立即被释放。 - Parag Bafna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接