2012-02-05 3 views
8

이것이 올바른 방법일까요?dispatch_data_t를 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 * 

잘 작동합니다. 나의 주요 관심사는 메모리 누출이다. 데이터 버퍼 누수는 재미 있지 않습니다. 그래서 NSData, 버퍼 및 dispatch_data_t new_data_file 모두 괜찮습니까?

내가 읽을 수있는 내용은 http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.c이며 버퍼는 DISPATCH_DATA_DESTRUCTOR_FREE 인 것 같습니다. 버퍼를 비우는 것이 내 책임이라는 뜻입니까?

답변

3

대부분 코드가 정확합니다. +initWithBytes:length:은 전송 된 버퍼를 복사하므로 데이터 이후에 버퍼를 확보 할 필요가 없으므로 데이터를 먼저 확보 할 수 있습니다. 당신이 그것으로 완료 한 후

문서에 따르면, 당신은 데이터를 해제하지 않습니다

당신이 buffer_ptr 또는 size_ptr에 대한 NULL이 아닌 값을 지정하면 값이 변수가 유효 전용 반환 새로 생성 된 디스패치 데이터 개체를 릴리스 할 때까지 이 값을 사용하여 새 데이터 오브젝트의 데이터에 신속하게 액세스 할 수 있습니다.

new_data_file 변수를 해제하면됩니다 (ARC는이 작업을 수행하지 않습니다).

11

IOS를 7 및 Mac OS X 10.9 이후 (Foundation Release Notes) dispatch_data_t는 NSObject의 (NSObject <OS_dispatch_data>)이다. dispatch_data_t을 이제는 NSData *으로 자유롭게 전송할 수 있습니다.

+2

이것은 iOS 7/10.9에만 해당됩니다. –

+2

Thx, 예, 출시 노트 링크를 추가했습니다. – catlan

+0

다른 사람들을위한 해결책은 무엇입니까? –

관련 문제