Кастинг с помощью ARC - PullRequest
       2

Кастинг с помощью ARC

29 голосов
/ 19 октября 2011

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

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

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

Ответы [ 3 ]

41 голосов
/ 19 октября 2011

Проблема в том, что атрибуты не должны быть словарем, это должен быть SecKeyRef или CFDataRef.А затем приведите это обратно в NSData для данных пароля, скопированных в него.

Примерно так:

CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
NSData *passDat = (__bridge_transfer NSData *)attributes;
6 голосов
/ 09 мая 2012

Когда мы делали нечто похожее и использовали приведенный выше пример, мы столкнулись с другой проблемой:

CFDataRef resultRef;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
               (CFTypeRef *)&resultRef);
NSData* result = (__bridge_transfer NSData*)resultRef; 

Это приведет к EXEC_BAD_ACCESS, потому что resultRef не установлен на какой-либо адрес и указывает где-то в памяти.

CFDataRef resultRef = nil;

Это исправит ошибку.

3 голосов
/ 06 апреля 2012

Необходимо изменить attributes на &attributes

CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery,  ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;
...