2012-04-20 13 views
7

Me gustaría obtener el nombre de usuario/contraseña de mi llavero. para esto he seguido esta guía:iOS: CFTypeRef no permitido con ARC

Simple iPhone Keychain Access

Pero esta parte no se permite con ARC:

NSData *result = nil;  
OSStatus status = SecItemCopyMatching(
        (CFDictionaryRef)searchDictionary,            
        (CFTypeRef *)&result); 

¿Qué puedo hacer yo?

Respuesta

19

ARC solo administra los tipos Objective-C. Si transfiere a los tipos de Fundación básica, debe indicarle a ARC quién posee la variable usando __bridge, __bridge_retained o __bridge_transfer.

Aquí está Apple's official documentation en el puente sin cargo bajo ARC, o vea this blog post (desplácese hacia abajo a Puente sin cargo) para obtener una descripción general excelente.

Por ejemplo:

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

gracias Simon. Ya usé '__bridge' pero para' (CFTypeRef *) & result); 'no funcionó .. Xcode notó: tipos incompatibles lanzando 'NSData * __ strong *' a 'CFTypeRef *' (también conocido como 'const void **') con un cast de __bridge – filou

+4

Separe su lanzamiento de su referencia. Algo como esto: 'CFTypeRef r = (__bridge CFTypeRef) result; Estado OSStatus = SecItemCopyMatching ((__ bridge CFDictionaryRef) searchDictionary, &r); ' –

+0

no funcionó. La solución de leelang por alguna razón lo hizo. Xcode 7.3 –

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

" Pruebe esto "no es muy útil ya que no explica lo que estaba mal de cómo solucionarlo en otro caso. –

Cuestiones relacionadas