Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
623 views
in Technique[技术] by (71.8m points)

cocoa - NSMutableData datawithBytesNoCopy:length:freeWhenDone: seems to make a copy of the buffer provided to it

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...