I have a fairly large NSData (or NSMutableData if necessary) object which I want to take a small chunk out of and leave the rest. Since I'm working with large amounts of NSData bytes, I don't want to make a big copy, but instead just truncate the existing bytes. Basically:
There are truncation methods in NSMutableData, but they only truncate the end of it, whereas I want to truncate the beginning. My thoughts are to do this with the methods:
Note that I used the wrong (copying) method in the original posting. I've edited and fixed it
- (const void *)bytes
and
- initWithBytesNoCopy:length:freeWhenDone:
However, I'm trying to figure out how to manage memory with these. I'm guessing the process will be like this (I've placed ????s where I don't know what to do):
// Get bytes
const unsigned char *bytes = (const unsigned char *)[source bytes];
// Offset the start
bytes += myStart;
// Somehow (m)alloc the memory which will be freed up in the following step
?????
// Release the source, now that I've allocated the bytes
[source release];
// Create a new data, recycling the bytes so they don't have to be copied
NSData destination = [[NSData alloc]
initWithBytesNoCopy:bytes
length:myLength
freeWhenDone:YES];
Thanks for the help!
Is this what you want?
NSData *destination = [NSData dataWithBytes:((char *)source.bytes) + myStart
length:myLength];
I know you said "I don't want to make a big copy," but this only does the same copy you were doing with getBytes:length:
in your example, so this may be okay to you.
There's also replaceBytesInRange:withBytes:length:
, which you might use like this:
[source setLength:myStart + myLength];
[source replaceBytesInRange:NSMakeRange(0, myStart)
withBytes:NULL
length:0];
But the doc's don't say how that method works (no performance characteristics), and source
needs to be an NSMutableData.