Литье с указателем с ARC
ARC с трудом справляется со следующим произведением:
NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
Ошибка: указание косвенного указателя на указатель Objective-C на 'CFTypeRef' (aka 'const void *') запрещается с помощью ARC
Ответы
Ответ 1
Проблема заключается в том, что атрибуты не должны быть словарем, это должен быть SecKeyRef или CFDataRef. И затем отбросьте это обратно в NSData для данных паролей, скопированных в него.
Так же:
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
NSData *passDat = (__bridge_transfer NSData *)attributes;
Ответ 2
Как мы делали что-то подобное и используя приведенный выше пример, мы столкнулись с другой проблемой:
CFDataRef resultRef;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
(CFTypeRef *)&resultRef);
NSData* result = (__bridge_transfer NSData*)resultRef;
Это приведет к EXEC_BAD_ACCESS, потому что resultRef не настроен на какой-либо адрес и не указывает где-то в память.
CFDataRef resultRef = nil;
Это исправит ошибку.
Ответ 3
Необходимо изменить attributes
на &attributes
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery, ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;