用以下高效方式,原理上是不复制内存:
dispatch_data_t accumulatedData = dispatch_data_empty;
// 假设我们有多个数据块需要合并
for (NSData *chunk in dataChunks) {
dispatch_data_t chunkData = dispatch_data_create(chunk.bytes, chunk.length,
dispatch_get_global_queue(0, 0),
DISPATCH_DATA_DESTRUCTOR_DEFAULT);
// 合并数据,非常高效,不需要复制
accumulatedData = dispatch_data_create_concat(accumulatedData, chunkData);
// 如果不再需要 chunkData,释放它
// dispatch_release(chunkData); // 在 ARC 下不需要
}
// 最后,如果需要 NSData,可以创建一个连续的内存区域
NSMutableData *finalData = [NSMutableData dataWithLength:0];
dispatch_data_apply(accumulatedData, ^bool(dispatch_data_t region, size_t offset, const void *buffer, size_t size) {
[finalData appendBytes:buffer length:size];
return true;
});