1

我正在尝试将 SFHF 钥匙串类(从此处)与 IOS 5 项目一起使用。我已经成功地将大部分课程转换为遵守新的 ARC 规则。

我在一小部分代码中遇到了一些问题,如下所示

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是一个按引用传递的返回值。

声明一个局部变量 type 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 回答