来自iOS5的按引用传递和objc_未恢复指针
我正在尝试将SFHF密钥链类()用于iOS5项目。我已经成功地改变了班上的大多数人,使他们遵守新的ARC规则 我在代码的一小部分遇到了一些问题,如下所示来自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
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”。