来自iOS5的按引用传递和objc_未恢复指针

来自iOS5的按引用传递和objc_未恢复指针,ios,ios5,automatic-ref-counting,Ios,Ios5,Automatic Ref Counting,我正在尝试将SFHF密钥链类()用于iOS5项目。我已经成功地改变了班上的大多数人,使他们遵守新的ARC规则 我在代码的一小部分遇到了一些问题,如下所示 OSStatus status = SecItemCopyMatching((CFDictionaryRef) objc_unretainedPointer(attributeQuery), (CFTypeRef *) objc_unretainedPointer(&attributeResult) 这就产生了以下语法问题: warn

我正在尝试将SFHF密钥链类()用于iOS5项目。我已经成功地改变了班上的大多数人,使他们遵守新的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开发还比较陌生,这让我现在很困惑。非常感谢您的帮助。

这是API的声明:

OSStatus SecItemCopyMatching (
   CFDictionaryRef query,
   CFTypeRef *result
);
结果
是一个按引用传递的返回值

声明一个
CFTypeRef
类型的局部变量,调用函数并根据API传递所述局部变量的地址,然后在函数调用后执行任何特定于ARC的诡计


是的,错误是正确的。您没有传递CFTypeRef,您传递的是CFTypeRef*,而objc_unretainedPointer()不知道该怎么做

做一些类似于:

CFTypeRef localResult
SecItemCopyMatching(query, &localResult);
if (... no error ...) {
   result = objc_retainedObject(localResult);
}

这是API的声明:

OSStatus SecItemCopyMatching (
   CFDictionaryRef query,
   CFTypeRef *result
);
结果
是一个按引用传递的返回值

声明一个
CFTypeRef
类型的局部变量,调用函数并根据API传递所述局部变量的地址,然后在函数调用后执行任何特定于ARC的诡计


是的,错误是正确的。您没有传递CFTypeRef,您传递的是CFTypeRef*,而objc_unretainedPointer()不知道该怎么做

做一些类似于:

CFTypeRef localResult
SecItemCopyMatching(query, &localResult);
if (... no error ...) {
   result = objc_retainedObject(localResult);
}

这个电话有问题,这是我的代码:

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];
}

这个电话有问题,这是我的代码:

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];
}

请注意,iOS 5 beta版仍在保密协议中,因此,如果您参加了Apple开发者计划,那么讨论此问题就是违反了您的协议。谢谢。我已经看到很多关于ARC不是NDA的一部分的提及。编辑**此处链接-请注意,iOS 5 beta版仍在保密协议中,因此,如果您参加了Apple开发者计划,您讨论此问题违反了协议。谢谢。我已经看到很多关于ARC不是NDA的一部分的提及。编辑这里的**链接-感谢您花时间回复,但是,我不得不说,我仍然对整件事感到困惑。这是一张来自Xcode的图片,显示了引发语法错误的确切部分-它似乎突出显示了“&attributeResult”。感谢您花时间回复,但是,我不得不说,我仍然对整件事感到困惑。下面是一个来自Xcode的图像,它显示了引发语法错误的确切部分-它似乎突出显示了“&attributeResult”。