Передача по ссылке и objc_unretainedPointer из iOS5 - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь использовать классы цепочки ключей 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, и это прямо сейчас поставило меня в тупик.Любая помощь с благодарностью.

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Это объявление 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 голосов
/ 21 января 2013

У меня были проблемы с этим звонком, вот код, который я получил на работу:

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