转换NSError返回CFErrorRef返回

时间:2011-12-14 19:21:48

标签: objective-c clang automatic-ref-counting core-foundation return-by-reference

我有一个通过引用返回NSError对象的函数:

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

此函数使用一个API,该指针指向CFErrorRef的存储指针。我想直接将outError传递给基础函数,但我无法弄清楚声明关键字和投射关键字的正确组合,以使clang同意该计划。有吗?

2 个答案:

答案 0 :(得分:3)

如果你看一下clang notes for __autoreleasing,它会提到魔术在分配时发生,这意味着自动施法在这里无济于事。您需要使用原始帖子的评论中提到的临时变量来实际进行分配。

答案 1 :(得分: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];