将返回的 NSError 转换为 CFErrorRef 返回

6

我有一个返回NSError对象的函数:

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

这个函数使用一个API,该API需要指向CFErrorRef存储的指针。我想直接将outError传递给底层函数,但我无法找到正确的声明关键字和转换关键字来让clang支持这个计划。有吗?


作弊?blah((CFErrorRef*)(void *)error); - Bored Astronaut
否则这只是一个两步过程。我认为编译器非常清楚它需要你进行本地声明。否则,它无法正确地进行簿记。 (CFErrorRef error2; blah(&error2); *error = (__bridge NSError *)error2; - 我想这就是你想避免的。) - Bored Astronaut
事实上,我宁愿不必自己将错误对象传回调用者。 - Peter Hosey
2个回答

4
如果您查看clang关于__autoreleasing的备注,它提到奇迹发生在赋值时,这意味着自动转换在这里无法帮助。您需要按照原始帖子中的评论使用临时变量进行实际赋值。

0

试试这个:

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

1
没有必要从NSError对象创建CFError对象,有两个原因:(1)我调用的函数返回一个CFError对象。(2) CFError和NSError是Toll-free bridged,所以CFError对象已经是NSError对象了。我想要的是一种方法,能够说服编译器让我将我的NSError out-pointer传递给底层函数的CFError out-pointer参数,既不会给我错误,也不会泄漏它。 - Peter Hosey
哦,我明白了,我只是严格按照主题线索来做的。这个有点难以孤立地证明,呵呵。 - jerrylroberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接