ARCは次のキャストで私に苦労しています:
NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
エラー: 'CFTypeRef '(aka'const void * ')へのObjective-Cポインターへの間接ポインターのキャストはARCでは許可されていません
問題は、属性が辞書ではなく、SecKeyRefまたはCFDataRefである必要があることです。次に、それをNSDataにキャストして、そこにコピーされたパスワードデータを取得します。
そのようです:
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
NSData *passDat = (__bridge_transfer NSData *)attributes;
同様のことをして上記の例を使用しているときに、別の問題に直面していました。
CFDataRef resultRef;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
(CFTypeRef *)&resultRef);
NSData* result = (__bridge_transfer NSData*)resultRef;
ResultRefはアドレスに設定されておらず、メモリのどこかを指しているため、これによりEXEC_BAD_ACCESSが発生します。
CFDataRef resultRef = nil;
これでエラーが修正されます。
attributes
を&attributes
に変更する必要があります
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery, ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;