web-dev-qa-db-ja.com

ARCによるポインタキャスト

ARCは次のキャストで私に苦労しています:

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

エラー: 'CFTypeRef '(aka'const void * ')へのObjective-Cポインターへの間接ポインターのキャストはARCでは許可されていません

29
mmvie

問題は、属性が辞書ではなく、SecKeyRefまたはCFDataRefである必要があることです。次に、それをNSDataにキャストして、そこにコピーされたパスワードデータを取得します。

そのようです:

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

同様のことをして上記の例を使用しているときに、別の問題に直面していました。

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

ResultRefはアドレスに設定されておらず、メモリのどこかを指しているため、これによりEXEC_BAD_ACCESSが発生します。

CFDataRef resultRef = nil;

これでエラーが修正されます。

6
scrat84

attributes&attributesに変更する必要があります

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