2012-01-12 5 views
7

Lo strumento di migrazione ARC sta avendo problemi con questo:Devo usare __bridge o __bridge_retained se sto collegando un oggetto autoreleased a Core Foundation?

NSURL *fileURL = [NSURL fileURLWithPath:path]; 
AudioFileOpenURL((CFURLRef)fileURL, kAudioFileReadPermission, 0, &fileID); 

In particolare, non è sicuro se si dovrebbe fare un __bridge o __bridge_retained. E lo sono anch'io.

-fileURLWithPath restituisce un oggetto autoreleased e in questo luogo non sono il proprietario di fileURL. Ma allo stesso tempo, l'oggetto ha un conteggio di almeno +1.

Scommetto che questo deve essere fatto solo con __bridge.

risposta

12

Si desidera utilizzare il cast regolare __bridge solo per questo. Si utilizzerà __bridge_retained solo se si desidera gestire il ciclo di vita di un oggetto CF cast. Per esempio:

CFStringRef cf_string = (__bridge_retained CFStringRef)someNSString; 
// some long time later, perhaps in another method etc 
CFRelease(cf_string); 

Così il __bridge_retained è davvero dicendo al compilatore che hai avuto un oggetto ARC e ora si vuole trasformare in sostanza in un oggetto CF che si sta andando a gestire direttamente.