Puntero Casting con arco
-
27-10-2019 - |
Pregunta
Arc me está dando un momento difícil con el siguiente elenco:
NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
Error: el elenco de un puntero indirecto a un puntero Objective-C a 'CftypeF '(AKA' const void *') está rechazado con arco
Solución
El problema es que los atributos no deberían ser un diccionario, debe ser un seckeyref o cfdatarf. Y luego vuelva a colocar 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;
Otros consejos
Mientras estábamos haciendo algo similares 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 en algún lugar a la memoria.
CFDataRef resultRef = nil;
Esto solucionará el error.
Necesidad de cambio attributes
a &attributes
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery, ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow