5

를 반환 주조 내가 참조로 NSError 객체를 반환하는 함수가 있습니다CFErrorRef에 NSError 복귀

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

이 기능은 CFErrorRef에 대한 스토리지에 대한 포인터를 취하는 API를 사용합니다. 난 그냥 outError 기본 함수에 직접 전달하고 싶습니다,하지만 난 선언 키워드 및 캐스팅 키워드의 올바른 조합을 알아낼 수 없다는 계획에 동의합니다. 하나 있습니까?

+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

두 가지 이유로 NSError 객체에서 CFError 객체를 만들 필요가 없습니다. (1) 호출하는 함수가 CFError 객체를 반환합니다. (2) CFError 및 NSError는 수신자 부담으로 연결되므로 CFError 객체는 이미 NSError 객체입니다. 내가 찾고있는 것은 컴파일러가 NSError out-pointer를 기본 함수의 CFError out-pointer 인수로 전달하도록 내게 오류를주지 않거나 누출시키지 않도록 설득하는 방법입니다. –

+0

오, 알겠습니다. 저는 주제를 철저히 따랐습니다. 그 중 하나는 고립에서 증명하기가 조금 더 어렵습니다. – jerrylroberts