2011-06-22 15 views
1

我正在尝试与IOS 5项目使用SFHF钥匙串类(from here)。我已经成功地将大部分课程转换为遵守新的ARC规则。通过引用和从iOS5 objc_unretainedPointer

我遇到一些麻烦的代码的一个小部分如下

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开发这现在我几乎陷入了困境。任何帮助是极大的赞赏。

+1

注意了iOS 5测试版仍然在保密协议,因此,如果您在Apple开发人员计划中,您通过讨论这一点违反了您的协议​​。 – Anomie

+0

谢谢。我见过很多提到ARC不属于SO的NDA的一部分。编辑**链接在这里 - http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html – Thenayr

+0

我站在纠正。 – Anomie

回答

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); 
} 
+0

感谢您花时间回复,但是我不得不说我对整件事情仍然感到困惑。这里是Xcode的图片,显示了哪个部分的语法错误 - http://i.imgur.com/XWE4l.png 它似乎突出显示了“&attributeResult”。 – Thenayr

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