6

से अस्वीकृत है, मैं CFStreamCreatePairWithSocketToHostNSInput और OutputStream एस के साथ उपयोग करना चाहता हूं। मेरे पास दो ivars NSInputStream *_inputStream और NSOutputStream *_outputStream हैं।'सीएफआरडस्ट्रीम रीफ *' के लिए एक उद्देश्य-सी सूचक में एक अप्रत्यक्ष सूचक का कास्ट एआरसी

CFStreamCreatePairWithSocketToHost(NULL, 
    (__bridge_retained CFStringRef)self.hostname, self.port, 
    (CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream); 

error: cast of an indirect pointer to an Objective-C pointer to ' CFReadStreamRef * ' (aka ' struct __CFReadStream ** ') is disallowed with ARC
error: cast of an indirect pointer to an Objective-C pointer to ' CFWriteStreamRef * ' (aka ' struct __CFWriteStream ** ') is disallowed with ARC

मैं इसे कैसे ठीक होगा:

निम्नलिखित मुझे दो त्रुटि संदेश देता है? मैंने __bridge का उपयोग करने की कोशिश की लेकिन मुझे समान त्रुटि संदेश मिल गए।

उत्तर

4

वास्तविक CFReadStreamRef और CFWriteStreamRef चर के लिए एक सूचक पास करें, फिर अपने एनएसटीपीपीएस को निर्दिष्ट करते समय डालें। मूल रूप से:

CFThingRef cfThing = NULL; 
CFFunctionGetThing(&cfThing); 
NSThing * nsThing = cfThing; 
बेशक

, आप cfThing के लिए उपयुक्त पुल वर्णक जोड़ने और सभी उचित संदर्भ गिनती ऑप्स करना होगा।

+0

क्या यह ऐसा करने का एकमात्र तरीका है? –

+0

@WTP सुनिश्चित नहीं है - मैंने आज तक एआरसी के साथ अधिक समय नहीं बिताया है। इसे लपेटो! :) – justin

+0

@WTP: यह भूलें कि फ़ंक्शन _inputStream और _outputStream की पिछली सामग्री को अपने स्वयं के नए CRStreamRefs के साथ ज़ैप करेगा, ताकि आप उन्हें CFStreamRefs भी बना सकें। – JeremyP

0

एआरसी क्या कर रहा है, और __bridge क्या करता है इसके बारे में सोचें: एआरसी एनएसओब्जेक्ट को बनाए रखने/जारी करने की ज़िम्मेदारी लेता है। __bridge उस जिम्मेदारी को हस्तांतरित करता है। उदाहरण के लिए, __bridge_retained ने एक एनएसएसटींग को बरकरार रखा है, पॉइंटर को CFStringRef में डाला है, और जो भी CFStringRef का उपयोग करता है, मिलान करने वाले रिलीज ऑपरेशन करने की ज़िम्मेदारी सौंपी है।

संभावित रूप से एनएसओब्जेक्ट * या कोर फाउंडेशन रेफरी के सूचक के साथ एक सूचक के साथ काम नहीं कर सकता है। एक सूचक बिंदु स्मृति स्थान पर इंगित करता है। किसी भी प्रकार का NSObject * या कोर फाउंडेशन ऑब्जेक्ट वहां संग्रहीत किया जा सकता है।

आपको दो चर की आवश्यकता है, एक एनएसआईएनपुटस्ट्रीम * के लिए और एक CFReadStreamRef के लिए। NSInputStream * को CFReadStreamRef में स्थानांतरित करने के लिए उचित पुल कास्ट का उपयोग करें। अब आपके पास वही है जो आप चाहते हैं, और पते को पास कर सकते हैं।

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