Подтвердить что ты не робот

Литье с указателем с ARC

ARC с трудом справляется со следующим произведением:

NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);

Ошибка: указание косвенного указателя на указатель Objective-C на 'CFTypeRef' (aka 'const void *') запрещается с помощью ARC

4b9b3361

Ответ 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;