NSMutableData datawithBytesNoCopy:length:freeWhenD

2019-01-15 11:05发布

问题:

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.



标签: cocoa nsdata