2010-09-27 5 views
18

Как преобразовать CFDataRef в NSData?Как преобразовать CFDataRef в NSData?

У меня есть CFDataRef, и я хочу преобразовать его в NSData. Я не понимаю, как это сделать.

кто-нибудь мне помочь ..

CGDataProviderRef dataProvider = CGImageGetDataProvider(screenShot); 
    CFDataRef data = CGDataProviderCopyData(dataProvider); 
    CGDataProviderRelease(dataProvider); 
    NSString *imagePathLocation = [destinationPath stringByAppendingString:[@"/" stringByAppendingString:DesktopImage]]; 
    [[NSFileManager defaultManager]createFileAtPath: imagePathLocation contents:nil attributes:nil]; 
    fileHandleForImage = [NSFileHandle fileHandleForWritingAtPath:imagePathLocation]; 
    NSData * data1 = (NSData *)data; 
    [fileHandleForImage writeData:data1]; 

Когда я типаж (NSData * data1 = (NSData *)data) это изображение испорчена.

+1

Я думаю, вы имеете в виду CFDataRef. Я не могу найти ссылки на CGDataRef в документации Apple. –

ответ

27

Это беспошлинный мост, поэтому вам просто нужно бросить его.

NSData *myData = (NSData *)myCFDataRef; 
+0

да его CFDataRef, извините. Я хочу сохранить CGImage. –

+4

это не разрешено в ARC. –

+1

Вам просто нужно добавить соответствующее ключевое слово для владения. См. Https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW3 и http: //www.mikeash .com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html (ищите «Toll-Free Bridging») для деталей. –

11

Как сказал @KrisMarkel, вы просто должны передать право собственности на ARC так:

Как и передать право собственности:

NSData* data1 = (__bridge_transfer NSData*) data; 

еще использовать ссылку без передачи права собственности:

NSData* data2 = (__bridge NSData*) data; 
Смежные вопросы