Приведение возврата NSError к возврату CFErrorRef - PullRequest
5 голосов
/ 14 декабря 2011

У меня есть функция, которая возвращает объект NSError по ссылке:

NSData *foo(NSData *foo, NSError *__autoreleasing *outError);

Эта функция использует API, который получает указатель на хранилище для CFErrorRef. Я хотел бы просто передать outError базовой функции напрямую, но я не могу определить правильную комбинацию ключевых слов объявления и ключевых слов приведения, чтобы заставить clang согласиться с этим планом. Есть ли один?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Если вы посмотрите на примечания лягушки для __autoreleasing, там будет упомянуто, что магия происходит во время назначения, что означает, что автоматическое приведение не может помочь здесь. Вы должны фактически выполнить назначение, используя временную переменную, как указано в комментариях к исходному сообщению.

0 голосов
/ 19 декабря 2011

Попробуйте это:

NSError + CFErrorRef.h

@interface NSError (CFErrorRef)

- (CFErrorRef) cferror;

@end

NSError + CFErrorRef.m

#import "NSError+CFErrorRef.h"

@implementation NSError (CFErrorRef)

- (CFErrorRef) cferror
{
    CFStringRef domain = (CFStringRef) self.domain;

    CFDictionaryRef userInfo = (__bridge CFDictionaryRef) self.userInfo;

    return CFErrorCreate(kCFAllocatorDefault, domain, self.code, userInfo);
}

@end

Я написал небольшой тестовый модуль для проверки того, что все преобразовано, и, похоже, оно работает правильно.Затем вы можете просто выполнить следующий селектор для вашего объекта NSError

CFErrorRef e = [error cferror];
...