1

iOS 5プロジェクトでSFHFキーチェーンクラス(ここから)を使用しようとしています。私はクラスのほとんどを新しいARCルールに従うように変換することに成功しました。

次のように、コードの1つの小さなセクションで問題が発生しています

OSStatus status = SecItemCopyMatching((CFDictionaryRef) objc_unretainedPointer(attributeQuery), (CFTypeRef *) objc_unretainedPointer(&attributeResult)

これにより、次の構文の問題が発生します。

warning: Semantic Issue: Incompatible pointer types passing 'NSDictionary *__strong *' to parameter of type 'id'

私はiOS開発にかなり慣れていないので、今はかなり困惑しています。どんな助けでも大歓迎です。

4

2 に答える 2

6

これはAPIの宣言です:

OSStatus SecItemCopyMatching (
   CFDictionaryRef query,
   CFTypeRef *result
);

result参照渡しの戻り値です。

タイプのローカル変数を宣言しCFTypeRef、関数を呼び出し、APIに従ってそのローカルのアドレスを渡し、関数呼び出しの後にARC固有のシェナニガンを実行します。


はい-エラーは正しいです。あなたはCFTypeRefを渡しておらず、CFTypeRef *を渡しており、objc_unretainedPointer()はそれをどうするかについての手がかりを持っていません。

次のようなことをします:

CFTypeRef localResult
SecItemCopyMatching(query, &localResult);
if (... no error ...) {
   result = objc_retainedObject(localResult);
}
于 2011-06-23T05:02:20.173 に答える
0

この呼び出しで問題が発生しました。これが私が機能するようになったコードです。

NSMutableDictionary *queryDictionary = [[NSMutableDictionary alloc] init];


// Set some properties.

[queryDictionary setObject:[key dataUsingEncoding:NSUTF8StringEncoding] forKey:(__bridge id)kSecAttrGeneric];
[queryDictionary setObject:(id) kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes];
[queryDictionary setObject:(__bridge id) kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
[queryDictionary setObject:(id) kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
[queryDictionary setObject:(__bridge id) kSecClassGenericPassword forKey:(__bridge id)kSecClass];

CFTypeRef attributes;
OSStatus keychainError = SecItemCopyMatching((__bridge CFDictionaryRef)(queryDictionary), &attributes);

if (keychainError == errSecSuccess)
{
    NSDictionary *returnedDictionary = (__bridge_transfer NSDictionary *)attributes;
    NSData *rawData = [returnedDictionary objectForKey:(__bridge id)kSecValueData];
    return [[NSString alloc] initWithBytes:[rawData bytes] length:[rawData length] encoding:NSUTF8StringEncoding];
}
于 2013-01-20T22:05:20.943 に答える