5

मैं एक समारोह है कि संदर्भ से एक NSError ऑब्जेक्ट है:कास्टिंग एक CFErrorRef के लिए एक NSError वापसी वापसी

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

यह समारोह एक API कि एक CFErrorRef के लिए भंडारण के लिए एक सूचक लेता है का उपयोग करता है। मैं सीधे अंतर्निहित फ़ंक्शन पर outError पास करना चाहता हूं, लेकिन मैं उस योजना के साथ क्लैंग से सहमत होने के लिए घोषणा कीवर्ड और कास्ट कीवर्ड के सही संयोजन को नहीं समझ सकता। क्या कोई है?

+0

धोखा? ब्लाह ((CFErrorRef *) (शून्य *) त्रुटि); –

+0

... अन्यथा यह केवल दो-चरणीय प्रक्रिया है। मुझे लगता है कि संकलक का स्पष्ट स्पष्ट है कि आपको स्थानीय घोषणा करने की आवश्यकता है। मुझे लगता है कि यह अपनी बहीखाता ठीक से नहीं कर सकता है, अन्यथा। (CFErrorRef त्रुटि 2; blah (और error2); * त्रुटि = (__bridge NSError *) त्रुटि 2; - मुझे लगता है कि आप यही से बचने की कोशिश कर रहे हैं)। –

+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 

मैं सब कुछ सत्यापित करने के लिए एक त्वरित थोड़ा इकाई परीक्षण परिवर्तित लिखा था खत्म हो गया और ऐसा लगता है कि यह सही ढंग से काम कर रहा है। फिर आप अपने एनएसईआरआर ऑब्जेक्ट पर निम्नलिखित चयनकर्ता को कर सकते हैं

CFErrorRef e = [error cferror]; 
+1

दो कारणों से, एक NSError ऑब्जेक्ट से CFError ऑब्जेक्ट बनाना आवश्यक नहीं है: (1) जिस फ़ंक्शन को मैं कॉल कर रहा हूं वह एक CFError ऑब्जेक्ट देता है। (2) CFError और NSError टोल-फ्री ब्रिज हैं, इसलिए CFError ऑब्जेक्ट पहले से ही एक NSError ऑब्जेक्ट है। जो मैं खोज रहा हूं वह संकलक को मनाने के लिए एक तरीका है जिससे मुझे अपने एनएसईआरर आउट-पॉइंटर को अंतर्निहित फ़ंक्शन के CFError आउट-पॉइंटर तर्क में या तो मुझे कोई त्रुटि या लीक करने के बिना पास करने दें। –

+0

ओह, मैं देखता हूं, मैं बस विषय पंक्ति से सख्ती से जा रहा था। वह अलगाव में साबित करने के लिए थोड़ा कठिन है – jerrylroberts

संबंधित मुद्दे