0

我在内存中有一个巨大的 NSMutableData 对象(大小约为 1 MB),现在我想将对象中的所有字节替换为 0(而不是释放内存)。resetBytesInRange 方法让我可以做到这一点。但是,如何验证/检查字节是否实际设置为 0。我想查看内存地址并确认这一点。这可能吗?

我有以下代码

NSMutableData *imgData = [NSMutableData dataWithCapacity:50000000];
imgData = (NSMutableData*)UIImageJPEGRepresentation(img, 1.0);
[imgData resetBytesInRange:NSMakeRange(0, [imgData length]) ];

现在,当我查看 imgData 指向的地址(以及以下几个位置)时,在 resetBytes 之前和之后,我看不到从 imgData 指向的地址开始的内存位置中的值有任何变化(我希望见分配的零)。我假设内存分配从 imgData 指向的地址开始是连续的(直到 [imgData 长度])。这个假设是否正确(似乎不是)?如果不是 NSMutableData 对象中的字节存储在哪里?我可以单独访问它们吗?

谢谢

维韦克

4

2 回答 2

0

问题不在于-resetBytesInRange:它不起作用。问题是您将该消息发送到错误的对象

imgData = (NSMutableData*)UIImageJPEGRepresentation(img, 1.0);不会将 JPEG 字节分配给您在第一行中创建的可变数据。它将您对该对象的引用替换为对新对象的引用,并使用强制转换来禁止编译器对无效存储的警告。有几种方法可以正确地做到这一点:

NSMutableData *imgData = [NSMutableData data]; /* note, we do not specify a capacity--it's pointless for this use case */
[imgData setData: UIImageJPEGRepresentation(img, 1.0)];
[imgData resetBytesInRange: NSMakeRange(0, [imgData length])];

或者:

NSMutableData *imgData = [[UIImageJPEGRepresentation(img, 1.0) mutableCopy] autorelease];
[imgData resetBytesInRange: NSMakeRange(0, [imgData length])];

但两者都忽略了显而易见的事实:如果您立即将数据清零,为什么还要费心创建 JPEG 数据?你到底在这里做什么?

于 2012-06-28T14:31:27.977 回答
0

imgData是一个指针(如*符号所示)。所以它指向一个内存位置,分配只会改变它指向的位置。大多数编程语言的真正意图并不是让您对实际内存位置进行逐字节操作。

阅读:http ://www.cplusplus.com/forum/general/3644/

于 2012-06-28T14:04:32.733 回答