कुछ फ़ाइलों के लिए स्वचालित संदर्भ गणना अक्षम करें


183

मैंने iOS 5 एसडीके डाउनलोड किया है और पाया है कि एआरसी नए ऐप्पल कंपाइलर की एक बड़ी विशेषता है। फिलहाल, कई तीसरे पक्ष के ढांचे एआरसी का समर्थन नहीं करते हैं। क्या मैं अपने नए कोड के लिए ARC का उपयोग कर सकता हूं और वर्तमान रिटेन / रिलीज कोड को अपरिवर्तित रख सकता हूं? ARC कनवर्टर यहां काम नहीं करता है, क्योंकि JSONKit जैसे कुछ फ्रेमवर्क, कनवर्टर का उपयोग करके ARC में परिवर्तित नहीं किए जा सकते हैं।

संपादित करें:

जवाब है -fno-objc-arcएआरसी नहीं चाहते फाइलों के लिए संकलक झंडे में जोड़ें । Xcode 4 में, आप इसे अपने लक्ष्य के तहत कर सकते हैं -> बिल्ड चरण -> संकलित स्रोत।



2
स्पष्ट करने के लिए, आप इसे .mफ़ाइल में जोड़ें । .hफाइल नहीं ।
ma11hew28

मुझे यह बातचीत मिली: github.com/gowalla/AFNetworking/issues/36 हो सकता है कि यह किसी को iOS5 ARC समर्थित प्रोजेक्ट में JSONKit को एकीकृत करने में मदद करे;; लेकिन मैंने इसे फिलहाल नहीं

इस विधि ने मेरे लिए काम किया। मैं अपने प्रोजेक्ट में UDP मल्टीकास्ट के लिए AsyncUdpSocket जोड़ रहा था और वे फाइलें [कम से कम वर्तमान संस्करण] ARC का समर्थन नहीं कर रहे हैं। इसलिए मैंने AsyncUdpSocket.m फाइल में कंपाइलर फ्लैग को जोड़ने के लिए ऊपर की विधि का उपयोग किया और मुझे अपने एप्लिकेशन के साथ काम करने के लिए कोड मिल सकता है।
आशु जोशी

2
यह पूरी तरह से काम करता है! Specifics: अपने टारगेट पर जाएं और Build Phases चुनें, फिर कंपाइल सोर्स। यदि आप प्रश्न में .m फ़ाइल पर डबल-क्लिक करते हैं, तो यह एक बॉक्स को पॉप करेगा जहाँ आप टाइप कर सकते हैं / पेस्ट कर सकते हैं: "-fno-objc-arc"
13:11 पर MPPurnurn

जवाबों:


73

सार्वजनिक एआरसी डॉक्स , जबकि इस बिंदु पर सीधे स्पष्ट नहीं हैं, यह सुझाव देते हैं कि जब तक प्रत्येक वर्ग एआरसी या सभी मैन्युअल रूप से प्रबंधित नहीं हो जाता है, तब तक कक्षाओं को एक ही कार्यक्रम में एकीकृत किया जा सकता है।

आप केवल एआरसी और गैर-एआरसी को एक ही वर्ग में नहीं मिला सकते हैं; दस्तावेज़ का कहना है कि भेजने retain, release, autorelease, या retainCount(टाइमर और देरी करता है, जो उपयोग सहित किसी भी तरह से संदेशों @selectorएआरसी कोड में प्रतिबंध लगा दिया गया है)। इसलिए आप एआरसी वर्ग में गैर-एआरसी नहीं कर सकते (क्योंकि आवश्यक संदेश प्रतिबंधित हैं) और आप एआरसी को गैर-एआरसी वर्ग में नहीं कर सकते हैं (क्योंकि एआरसी सिंटैक्स तत्वों को जोड़ता है जो एआरसी के बिना अमान्य हैं)।

एक ही दस्तावेज़ थोड़ा स्पष्ट है कि क्या आप गैर-एआरसी पुस्तकालयों / रूपरेखाओं को एआरसी कार्यक्रम में एकीकृत कर सकते हैं: हाँ। यह उल्लेख नहीं करता है कि क्या आप किसी प्रोग्राम में ARC लाइब्रेरी / फ्रेमवर्क का उपयोग कर सकते हैं जहां आपका सभी कोड गैर-ARC है, लेकिन उपरोक्त सभी को देखते हुए, निहितार्थ हाँ लगता है।


धन्यवाद! मुझे पता चला है कि मौजूदा गैर-एआरसी कक्षाओं के लिए एआरसी को कैसे अक्षम किया जाए।
नॉनमैलेटिव

क्या आप हमारे साथ साझा कर सकते हैं कि आप क्या कर रहे हैं?
डेविड एच।

1
@ डेविड एच: यदि आपको प्रश्नकर्ता को संबोधित करने का मतलब है, तो आपको ध्यान देना चाहिए कि प्रश्नकर्ता ने प्रश्न में उनके समाधान को संपादित किया।
पीटर होसी जुएल

एआरसी संकलन को हेडर फाइलों में अक्षम नहीं किया जा सकता है। क्लैंग इसके कार्यान्वयन / विधि फ़ाइल के संकलन के आधार पर इंटरफ़ेस / हेडर को संकलित नहीं करेगा। इसलिए, हेडर फ़ाइलों को मिश्रित संकलन में एआरसी और गैर-एआरसी दोनों के साथ संगत होना चाहिए। मैं इसे संकलक में एक बग के रूप में देखता हूं।
कैरमिन

1
@ क्रीम: यह नहीं है। कंपाइलर हेडर फ़ाइलों को नहीं देखता है सिवाय जब आप इसे बताते हैं, जो आप सामान्य रूप से केवल #importमॉड्यूल फ़ाइलों से प्राप्त करते हैं। संकलक झंडे की सेटिंग प्रत्येक मॉड्यूल फ़ाइल के लिए है (अधिक सटीक रूप से, "संकलन स्रोत" निर्माण चरण में प्रत्येक फ़ाइल)। कंपाइलर के पास यह जानने का कोई तरीका नहीं है कि उसे एआरसी का उपयोग करना चाहिए या किसी अन्य फ़ाइल के लिए नहीं, सिवाय इसके कि इसे शुरू किए गए मॉड्यूल फ़ाइल के लिए दिए गए विकल्प को विरासत में देने के अलावा।
पीटर होसी

78

यह बहुत सहज नहीं है कि MULTIPLE फ़ाइलों पर ARC को कैसे निष्क्रिय किया जाए , थोड़ी देर के लिए मैं इसे एक-एक करके पता लगा रहा था कि यह कैसे करना है।

  1. Xcode में लक्ष्य / बिल्ड चरणों / संकलन सूत्रों पर वांछित फ़ाइलों का चयन करें (CMD + क्लिक या Shift + क्लिक)
  2. PRESS ENTER (दोहरा क्लिक चयन को रीसेट कर देगा, इसलिए यह काम नहीं करेगा)
  3. टाइप -fno-objc- चाप
  4. Enter या पूरा दबाएं

1
यह वास्तव में यहां पूछे गए सवाल का जवाब नहीं है, लेकिन वैसे भी एक खूनी अच्छी टिप! वोट दिया +1
क्रिस्टोफ़ वान लैंडस्कूट

आप सही हैं, यह नहीं है, लेकिन मैं हमेशा स्विच के लिए जाता हूं और यह शीर्ष हिट में से एक है। मैंने सोचा कि इन दिनों ज्यादातर लोग पहले से ही इसका जवाब जानते हैं, लेकिन यह "टिप" नहीं है
टिबिडाबो

35

अगर आप कुछ फाइलों के लिए ऑटोमैटिक रेफरेंस काउंटिंग को डिसेबल करना चाहते हैं, तो इसके लिए सिंपल स्टेप्स को फॉलो करना आसान है। आप टारगेट में कंपाइलर फ्लैग ऐड करें-> बिल्ड फेज -> कंपाइल सोर्स।

xcode

उपयोग किया गया झंडा है -fno-objc- आर्क प्रेस इसे लिखने के बाद दर्ज करें। आपको कंपाइलर फ्लैग्स के नीचे पंक्ति के दाहिने कॉलम पर डबल क्लिक करना होगा। आशा है कि यह मदद करता है धन्यवाद :)


14
आप गैर-ARC प्रोजेक्ट में किसी विशिष्ट फ़ाइल पर ARC को ध्वज का उपयोग करके सक्षम करने के लिए उसी विधि का उपयोग कर सकते हैं -fobjc-arc
lnafziger

एआरसी संकलन को हेडर फाइलों में अक्षम नहीं किया जा सकता है। क्लैंग इसके कार्यान्वयन / विधि फ़ाइल के संकलन के आधार पर इंटरफ़ेस / हेडर को संकलित नहीं करेगा। इसलिए, हेडर फ़ाइलों को मिश्रित संकलन में एआरसी और गैर-एआरसी दोनों के साथ संगत होना चाहिए। मैं इसे संकलक में एक बग के रूप में देखता हूं।
कैरम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.