5

を返すキャストIが参照によりNSErrorオブジェクトを返す関数を有する:CFErrorRefにNSErrorリターンが

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

この関数はCFErrorRef用のストレージへのポインタをとるAPIを使用します。私はちょうどoutErrorを基になる関数に直接渡したいと思いますが、宣言キーワードとキャストキーワードの正しい組み合わせがわかりません。 1つはありますか?

+0

カンニング? blah((CFErrorRef *)(void *)エラー); –

+0

...それ以外の場合は、2段階のプロセスです。私はコンパイラがローカル宣言をする必要があることはかなり明白だと思います。私はそれが正しく、その簿記を行うことはできないと思う。 (CFErrorRef error2; blah(&error2); * error =(__bridge NSError *)error2; - あなたが避けようとしているものだと思います。 –

+0

確かに、エラーオブジェクトを発信者自身にホットポテトしてもらう必要はありません。 –

答えて

3

clang notes for __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

2つの理由から、NSErrorオブジェクトからCFErrorオブジェクトを作成する必要はありません。(1)呼び出す関数はCFErrorオブジェクトを返します。 (2)CFErrorとNSErrorはフリーダイヤルでブリッジされているため、CFErrorオブジェクトはすでにNSErrorオブジェクトです。私が探しているのは、コンパイラに、NSErrorのアウトポインタを、関数のCFErrorのアウトポインタ引数に渡してもらうことです。エラーを出すことも、漏れさせることもありません。 –

+0

ああ、私はちょうど件名から厳密に外れていた。それは孤立していることを証明するのがちょっと難しいです – jerrylroberts