2012-04-20 9 views

risposta

19

ARC gestisce solo i tipi Objective-C. Se si esegue il casting su tipi di Core Foundation, è necessario comunicare a ARC chi possiede la variabile utilizzando __bridge, __bridge_retained o __bridge_transfer.

Ecco il numero verde Apple's official documentation per il ponte senza pedaggio sotto ARC, oppure vedere this blog post (scorrere verso il basso fino a Numero verde Bridging) per una panoramica eccezionale.

Ad esempio:

NSData *inData = nil; 
CFTypeRef inTypeRef = (__bridge CFTypeRef)inData; 
OSStatus status = SecItemCopyMatching(
        (__bridge CFDictionaryRef)searchDictionary, 
        &inTypeRef); 
+0

grazie Simon. Ho già usato '__bridge' ma per' (CFTypeRef *) e risultato); 'non ha funzionato .. Xcode ha notato: tipi incompatibili che lanciano 'NSData * __ strong *' a 'CFTypeRef *' (noto anche come 'const void **') con un cast __bridge – filou

+4

Separa il cast dal tuo dereferenziamento. Qualcosa del genere: 'CFTypeRef r = (__bridge CFTypeRef) risultato; OSStatus status = SecItemCopyMatching ((__ bridge CFDictionaryRef) searchDictionary, &r); ' –

+0

non ha funzionato.leelang soluzione per qualche ragione ha fatto. Xcode 7.3 –

1
CFTypeRef inData = NULL; 
OSStatus status = SecItemCopyMatching(
        (__bridge CFDictionaryRef)searchDictionary, 
        & inData); 
NSData *data = (__bridge NSData *)inData; 
+0

" Try this "non è molto utile in quanto non spiega cosa c'era di sbagliato su come risolvere in un altro caso. –