我在内存中有一个巨大的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指向的地址开始是连续的(upto [imgData length])。这个假设是corerct(看起来不是这样)吗?如果不存在NSMutableData对象中的字节在哪里?我可以单独访问它们吗?
由于
的Vivek
答案 0 :(得分:0)
imgData
是一个指针(由*
符号表示)。所以它指向一个内存位置,并且赋值只会改变它指向的位置。大多数编程语言的目的并不是让你对实际的内存位置进行逐字节操作。
答案 1 :(得分: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数据呢?你实际试图在这做什么?