问题
According to Apple documentation, the class method
+datawithBytesNoCopy:length:freeWhenDone:
inherited from NSData
Creates and returns a data object that holds a given number of bytes from a given buffer.
But
NSUInteger len = 1024;
char *buffer = malloc(len);
NSMutableData *data = [NSMutableData dataWithBytesNoCopy:buffer length:len freeWhenDone:YES];
char *dataBytes = data.mutableBytes;
NSLog(@"%@", dataBytes == buffer ? @":D" : @":(");
prints
:(
The method seems to actually make a copy, where I expected it not to. Am I using this the wrong way? The equivalent NSData method works as expected. How would I create an NSMutableData object pointing to an already existing buffer without taking any ownership?
回答1:
I would guess that you just can't do what you want to do. After all, if you have an NSMutableData
and append some more data to it, then the buffer would need to be reallocated, and no longer use the pointer you supplied.
Apple's Binary Data Programming Guide says that in the case of NSMutableData
, the bytes are copied anyway.
来源:https://stackoverflow.com/questions/18770265/nsmutabledata-datawithbytesnocopylengthfreewhendone-seems-to-make-a-copy-of-t