Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
649 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 Reply

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...