objective c - Puntero fundido con ARC
objective-c automatic-ref-counting (3)
ARC me está haciendo pasar un mal momento con el siguiente reparto:
NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
Error: la conversión de un puntero indirecto a un puntero de Objective-C a ''CFTypeRef '' (también conocido como ''const void * '') no está permitida con ARC
Como estábamos haciendo algo similar y usando el ejemplo anterior, nos enfrentamos a otro problema:
CFDataRef resultRef;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
(CFTypeRef *)&resultRef);
NSData* result = (__bridge_transfer NSData*)resultRef;
Esto dará como resultado un EXEC_BAD_ACCESS, porque resultRef no se establece en ninguna dirección y apunta a algún lugar de la memoria.
CFDataRef resultRef = nil;
Esto solucionará el error.
El problema es que los atributos no deberían ser un diccionario, deberían ser un SecKeyRef o CFDataRef. Y luego vuelva a convertir eso en NSData para los datos de contraseña copiados en él.
Al igual que:
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
NSData *passDat = (__bridge_transfer NSData *)attributes;
Necesidad de cambiar attributes
a &attributes
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery, ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;