दिलचस्प पोस्ट
एंड्रॉइड स्टूडियो और ग्रैडल बिल्ड त्रुटि Android Gradle कॉन्फ़िगरेशन में वर्तमान बिल्ड प्रकार कैसे प्राप्त करें IPhone में एक पारदर्शी पीएनजी छवि को कैसे टिंट करें? मैं जावास्क्रिप्ट में स्पैन तत्व का पाठ कैसे बदल सकता हूँ Android में कियोस्क मोड यह सीएसएस मार्जिन टॉप स्टाइल काम क्यों नहीं करता है? खोजक के साथ समूह कैप्चर कर रहा है? एक डेटा फ्रेम को स्थानांतरित करें एक क्या करता है पायथन में एक आयात स्टेटमेंट में क्या मतलब है? स्कला में मान्य पहचानकर्ता वर्ण iPhone में "निकास कोड 1 के साथ कमांड / बिन / श असफल" को कैसे ठीक करें ओपनसीवी 3.0 में गैर-मुक्त मॉड्यूल गायब है वस्तु ढेर के लिए पर्याप्त स्थान आरक्षित नहीं कर सके मैं urllib2 के साथ SOCKS 4/5 प्रॉक्सी का उपयोग कैसे कर सकता हूं? क्या हमें आईई 6 का समर्थन करना चाहिए?

एआरसी और पुल कास्ट

एआरसी के साथ, अब मैं CGColorRef को CGColorRef नहीं डाल सकता मुझे पता चला कि मुझे ब्रांडेड कलाकारों की ज़रूरत है अनुसार रिंगों दस्तावेज़ :

एक ब्रॉडीड कास्ट एक सी-स्टाइल कास्ट है जिसे तीन कुंजीशब्दों में से एक के साथ एनोटेट किया गया है:

(__bridge T) op ने ऑपरैंड को गंतव्य प्रकार T में डाला यदि T एक धारणीय ऑब्जेक्ट पॉइंटर प्रकार है, तो op में एक गैर-रिटेननीय पॉइंटर प्रकार होना चाहिए। अगर T एक गैर-रिटेन्यूबल पॉइंटर प्रकार है, तो ऑप्शन में एक रीटेबल ऑब्जेक्ट पॉइंटर प्रकार होना चाहिए। अन्यथा कलाकारों का खराब स्वरूप है। स्वामित्व का कोई स्थानान्तरण नहीं है, और एआरसी सम्मिलित होने से कोई भी संचालन नहीं होता है।

(__bridge_retained T) op ऑपरेंड को काटता है, जिसमें गंतव्य प्रकार के लिए धारणीय ऑब्जेक्ट पॉइंटर प्रकार होना चाहिए, जो कि एक गैर-रिटेननीय पॉइंटर प्रकार होना चाहिए। एआरसी मूल्य को बरकरार रखता है, स्थानीय मूल्यों पर सामान्य अनुकूलन के अधीन है, और प्राप्तकर्ता उस +1 को संतुलित करने के लिए जिम्मेदार है।

(__bridge_transfer T) op ऑपरेंड को काटता है, जिसमें गैर-रीटेटेनबल पॉइंटर प्रकार, गंतव्य प्रकार के लिए होना चाहिए, जो कि एक धारणीय ऑब्जेक्ट पॉइंटर प्रकार होना चाहिए। एआरसी पूरी तरह से अभिव्यक्ति के समापन पर मूल्य जारी करेगा, स्थानीय मूल्यों पर सामान्य अनुकूलन के अधीन।

एआरसी नियंत्रण में ऑब्जेक्ट्स को स्थानांतरित करने के लिए इन डासों की आवश्यकता होती है; धारणीय वस्तु संकेतक के रूपांतरण पर अनुभाग में तर्क देखें

एक __bridge_retained या __bridge_transfer का उपयोग करते हुए पूरी तरह से एआरसी को असंतुलित बनाए रखने या रिहाई का उत्सर्जन करने के लिए समझा जाता है, यह क्रम खराब है।

किस तरह की स्थितियों में मैं प्रत्येक का उपयोग करेगा?

उदाहरण के लिए, CAGradientLayer में एक colors संपत्ति है जो CGColorRef s की एक सरणी को स्वीकार करता है। मेरा अनुमान है कि मुझे यहां __brige का उपयोग __brige चाहिए, लेकिन वास्तव में मुझे क्यों चाहिए (या नहीं) स्पष्ट नहीं है

Solutions Collecting From Web of "एआरसी और पुल कास्ट"

मैं मानता हूं कि विवरण भ्रामक है। चूंकि मैंने उन्हें समझा, मैं संक्षेप करने की कोशिश करूंगा:

  • (__bridge_transfer <NSType>) op या वैकल्पिक रूप से CFBridgingRelease(op) को एआरसी पर स्थानांतरित करते समय CFTypeRef एक बनाए रखने वाली संख्या का उपभोग करने के लिए उपयोग किया जाता है। यह id someObj = (__bridge <NSType>) op; CFRelease(op); भी प्रतिनिधित्व किया जा सकता है id someObj = (__bridge <NSType>) op; CFRelease(op); id someObj = (__bridge <NSType>) op; CFRelease(op);

  • (__bridge_retained <CFType>) op या वैकल्पिक रूप से CFBridgingRetain(op) का इस्तेमाल CFBridgingRetain(op) को सीएफ़-भूमि को सौंपने के लिए किया जाता है जबकि उसे एक +1 बनाए रखने के लिए गिनती होती है आपको एक CFTypeRef को संभाल करना चाहिए जो आप इस तरह से बनाते हैं जैसे कि आप CFStringCreateCopy() का परिणाम संभाल CFStringCreateCopy() । यह CFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op; भी प्रतिनिधित्व किया जा सकता है CFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op; CFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op;

  • __bridge बस सूचक-भूमि और उद्देश्य-सी ऑब्जेक्ट-भूमि के बीच में डाले हुए हैं। यदि ऊपर दिए गए रूपांतरणों का उपयोग करने के आपके पास कोई झुकाव नहीं है, तो इसका उपयोग करें

शायद यह उपयोगी है खुद, मैं CFBridging… पसंद करता CFBridging… काफी कुछ।

मुझे आईओएस दस्तावेजों में एक और स्पष्टीकरण मिला, जो मुझे लगता है कि समझने में आसान है:

  • __bridge स्वामित्व के हस्तांतरण के बिना उद्देश्य-सी और कोर फाउंडेशन के बीच एक सूचक को स्थानांतरित करता है।

  • __bridge_retained (CFBridgingRetain) एक कोर __bridge_retained (CFBridgingRetain) एक उद्देश्य- C पॉइंटर को डाले और आप के स्वामित्व को स्थानांतरित कर दिया।

    ऑब्जेक्ट के स्वामित्व को छोड़ने के लिए आप सीएफआरईलीज या किसी संबंधित फ़ंक्शन को कॉल करने के लिए जिम्मेदार हैं

  • __bridge_transfer (CFBridgingRelease) एक गैर- Objective-C पॉइंटर को ऑब्जेक्टिव-सी में ले जाता है और एआरसी को स्वामित्व स्थानांतरित करता है।

    एआरसी वस्तु के स्वामित्व को त्यागने के लिए उत्तरदायी है

स्रोत: टोल फ्री ब्रिज वाला प्रकार

फॉलो-ऑन के रूप में, इस विशिष्ट मामले में, यदि आप आईओएस पर हैं, तो एप्पल UIColor और इसके -CGColor विधि का उपयोग करने की सिफारिश करता है, ताकि एनएसएआरआर colors में CGColorRef लौटा सके। एआरसी रिलीज नोट्स के संक्रमण में "कोकोआ -CGColor कम्पाइलर हैंडल्स सीएफ़ ऑब्जेक्ट्स" खंड के तहत, यह संकेत दिया जाता है कि -CGColor जैसे एक विधि का उपयोग -CGColor जो कोर फाउंडेशन ऑब्जेक्ट देता है, स्वचालित रूप से कंपाइलर द्वारा ठीक से संभाला जाएगा।

इस प्रकार, वे निम्नलिखित कोड की तरह सुझाव देते हैं:

 CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer]; gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], (id)[[UIColor lightGrayColor] CGColor], nil]; 

ध्यान दें कि अभी के रूप में, ऐप्पल का उदाहरण कोड, जिस पर मैं ऊपर है (आईडी) का गुम है, जो अभी भी कंपाइलर त्रुटि से बचने के लिए आवश्यक है