2012-02-05 24 views
8

Đây có phải là cách phù hợp không?Làm thế nào để chuyển đổi dispatch_data_t sang NSData?

// convert 
const void *buffer = NULL; 
size_t size = 0; 
dispatch_data_t new_data_file = dispatch_data_create_map(data, &buffer, &size); 
if(new_data_file){ /* to avoid warning really - since dispatch_data_create_map demands we care about the return arg */} 

NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size]; 

// use the nsdata... code removed for general purpose 

// clean up 
[nsdata release]; 
free(buffer); // warning: passing const void * to parameter of type void * 

Nó hoạt động tốt. Mối quan tâm chính của tôi là rò rỉ bộ nhớ. Rò rỉ bộ đệm dữ liệu không phải là niềm vui. Vì vậy, là NSData, bộ đệm và dispatch_data_t new_data_file tất cả tiền phạt?

Từ những gì tôi có thể đọc trên http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.c có vẻ như bộ đệm là DISPATCH_DATA_DESTRUCTOR_FREE. Điều đó có nghĩa là tôi có trách nhiệm giải phóng bộ đệm không?

Trả lời

3

Đối với hầu hết các phần, mã của bạn là chính xác. +initWithBytes:length: sẽ sao chép bộ đệm được gửi trong đó, bạn không phải lo lắng về việc giải phóng bộ đệm sau dữ liệu, trước tiên bạn có thể giải phóng dữ liệu một cách an toàn.

Theo tài liệu, bạn không giải phóng dữ liệu sau khi bạn đang thực hiện với nó:

Nếu bạn chỉ định giá trị NULL cho buffer_ptr hoặc size_ptr, các giá trị trả lại trong các biến có giá trị duy nhất cho đến khi bạn phát hành dữ liệu công văn mới được tạo ra đối tượng. Bạn có thể sử dụng các giá trị này như một cách nhanh chóng để truy cập dữ liệu của đối tượng dữ liệu mới.

Bạn chỉ cần giải phóng biến số new_data_file (ARC sẽ không thực hiện việc này cho bạn).

11

Vì iOS 7 và Mac OS X 10.9 (Foundation Release Notes) dispatch_data_t là NSObject (NSObject <OS_dispatch_data>). dispatch_data_t hiện có thể được tự do truyền tới NSData *, mặc dù không ngược lại.

+2

Điều này chỉ đúng trên iOS 7/10.9 –

+2

Thx, vâng, tôi đã thêm liên kết ghi chú phát hành. – catlan

+0

Giải pháp cho người khác là gì? –