2011-10-25 16 views
42

आईओएस प्रोजेक्ट में नई स्वचालित संदर्भ गिनती (एआरसी) मेमोरी प्रबंधन शैली का उपयोग करने के फायदे और नुकसान क्या हैं?एआरसी का उपयोग करने के फायदे और नुकसान क्या हैं?

क्या आप आईओएस 5.0 एसडीके के साथ विकास करते समय एआरसी का उपयोग नहीं करना चुन सकते हैं?

क्या आप एक नई परियोजना के लिए एआरसी या मैनुअल संदर्भ गिनती (एमआरसी) की सलाह देते हैं?

क्या एआरसी का उपयोग करने वाला कोई एप्लिकेशन आईओएस 5.0 की तुलना में पुराने ओएस संस्करणों पर चलाने में सक्षम होगा?

+2

आपके यहां कई प्रश्न हैं, जिनमें से दो प्रश्नों में संबोधित हैं [नया स्वचालित संदर्भ गिनती तंत्र कैसे काम करता है?] (Http://stackoverflow.com/questions/6385212/how-does-the-new- स्वचालित-संदर्भ-गिनती-तंत्र-कार्य) और [एआरसी के साथ एक्सकोड 4.2: क्या मेरा कोड 5.0 से पुराने फर्मवेयर के साथ आईओएस डिवाइस पर भी चलाएगा?] (http://stackoverflow.com/questions/7768861/xcode-4-2 -साथ-arc-will-my-code-run-even-on-ios-devices-with-firmware-old-tha) –

उत्तर

60

आईओएस प्रोजेक्ट में नई स्वचालित संदर्भ गिनती (एआरसी) मेमोरी प्रबंधन शैली का उपयोग करने के फायदे और नुकसान क्या हैं?

एक एआरसी कार्यक्रम का निष्पादन लगभग अच्छी तरह से लिखित एमआरसी के समान है। यही है, व्यवहार मतभेद अक्सर ज्ञानी नहीं होते हैं क्योंकि संचालन और प्रदर्शन दोनों क्रम बहुत करीब हैं।

यदि आप पहले से ही जानते हैं कि मैन्युअल संदर्भ गिनती (एमआरसी) के साथ ओएस एक्स या आईओएस ऐप्स को कैसे कार्यान्वित किया जाए, तो एआरसी वास्तव में कार्यक्षमता नहीं जोड़ता है - यह आपको अपने स्रोतों से संदर्भ गिनती संचालन को हटाने की अनुमति देता है।

यदि आप एमआरसी सीखना नहीं चाहते हैं, तो आप पहले एआरसी आज़मा सकते हैं। बहुत से लोग संघर्ष करते हैं, या एमआरसी के सामान्य प्रथाओं को अनदेखा करने का प्रयास करते हैं (उदाहरण: मैंने स्थिर विश्लेषक को कई ओबीजेसी देवताओं को पेश किया है)। यदि आप उन मुद्दों से बचना चाहते हैं, तो एआरसी आपको अपनी समझ स्थगित करने की अनुमति देगा; आप एमआरसी, एआरसी, या जीसी चाहे संदर्भ संदर्भ और वस्तु जीवनकाल और रिश्तों को समझने के बिना नॉनट्रिविअल ओबीजेसी कार्यक्रम नहीं लिख सकते हैं। एआरसी और जीसी बस अपने स्रोतों से कार्यान्वयन को हटा दें और अधिकांश मामलों में सही स्थिति करें। एआरसी और जीसी के साथ, आपको अभी भी कुछ मार्गदर्शन देने की आवश्यकता होगी।

मैंने इसे माप नहीं लिया है, लेकिन यह उल्लेखनीय हो सकता है कि संकलित एआरसी स्रोतों में अधिक समय और संसाधन लगेगा।

कार्यक्रम आप विकसित कर रहे हैं संदर्भ गिनती के बजाय ढीला उपयोग (जैसे autoreleases का एक विशिष्ट राशि) है, तो चाप को वास्तव में अपने कार्यक्रम के निष्पादन समय और चोटी स्मृति के उपयोग को बेहतर बना सकते स्विचन।

क्या आप आईओएस 5.0 एसडीके के साथ विकास करते समय एआरसी का उपयोग नहीं करना चुन सकते हैं?

हाँ, CLANG_ENABLE_OBJC_ARC का उपयोग करके। एआरसी द्विआधारी संगत है, और जो वास्तव में होता है वह यह है कि वर्तमान अनुवाद (see my answer here as to why translation visibility is important) के लिए दिखाई देने वाली घोषणाओं के आधार पर संकलक स्वचालित रूप से आपके लिए उपयुक्त संदर्भ गणना संचालन शुरू करने का सर्वोत्तम प्रयास करता है। इसलिए, आप इसे किसी प्रोजेक्ट में कुछ स्रोतों के लिए सक्षम और अक्षम भी कर सकते हैं और इसे दूसरों के लिए सक्षम कर सकते हैं।

मिश्रित मोड (कुछ एमआरसी और कुछ एआरसी स्रोत) हालांकि काफी जटिल हैं, और संक्षेप में, विशेष रूप से wrt कार्यान्वयन जिन्हें संकलक द्वारा डुप्लिकेट किया जा सकता है (उदाहरण के लिए एक इनलाइन फ़ंक्शन का शरीर गलत हो सकता है)। इस तरह के मिश्रित मोड मुद्दों को अलग करना बहुत कठिन होगा। ObjC++ प्रोग्राम और स्रोत विशेष रूप से इस संबंध में कठिन होंगे। इसके अलावा, व्यवहार आपकी अनुकूलन सेटिंग्स (एक उदाहरण के रूप में) के आधार पर भिन्न हो सकता है; एक प्रोग्राम जो डीबग बिल्ड में पूरी तरह से काम करता है, रिलीज में रिसाव या ज़ोंबी पेश कर सकता है।

क्या आप एक नई परियोजना के लिए एआरसी या मैन्युअल संदर्भ गिनती (एमआरसी) की सलाह देते हैं?

व्यक्तिगत रूप से, मैं कुछ समय के लिए एमआरसी के साथ चिपके रहूंगा। यहां तक ​​कि यदि असली दुनिया के उपयोग में एआरसी का परीक्षण किया गया है, तो संभवतः जटिल परिदृश्यों में दिखाई देने वाले कई मुद्दे शेष हैं, जिन्हें आप जानना और डीबग करने वाले पहले व्यक्ति से बचना चाहते हैं। ओएस एक्स का कचरा संग्रह एक उदाहरण है कि आप क्यों इंतजार करना चाहेंगे। एक उदाहरण के रूप में, ऑब्जेक्ट नष्ट होने पर स्विच बदल सकता है - आपकी ऑब्जेक्ट्स जल्द ही नष्ट हो सकती हैं और कभी भी ऑटोरेलीज पूल में नहीं रखी जा सकती हैं। यह उस क्रम को भी बदल सकता है जिसमें इवर जारी किए जाते हैं, जिसके कुछ दुष्प्रभाव हो सकते हैं।

मेरे पास एक बड़ा कोडबेस भी है जो मैं इस समय इस सुविधा का परीक्षण करने के लिए एक सप्ताह खोना नहीं चाहता हूं। अंत में, मेरे लिए पिछड़ा संगतता अभी भी महत्वपूर्ण है।

क्या एआरसी का उपयोग करने वाला कोई एप्लिकेशन आईओएस 5.0 की तुलना में पुराने ओएस संस्करणों पर चलाने में सक्षम होगा?

यदि आप एमआरसी के साथ विकसित होते हैं, तो यह पीछे की ओर संगत होगा। यदि आप एआरसी के साथ विकसित होते हैं, तो यह आवश्यक नहीं होगा। वास्तव में, यह थोड़ा अतिरिक्त काम के बिना भी संकलित नहीं हो सकता है। रनटाइम के लिए आवश्यकताएं कुछ पुराने संस्करणों में उपलब्ध हैं। See also this question। यदि आपको पिछली संगतता की आवश्यकता है, तो एआरसी कुछ ओएस संस्करणों के लिए एक विकल्प नहीं होगा।

आखिरकार, यदि आप जीसी या एआरसी को पसंद सीमित करना चाहते हैं, तो मैं एआरसी की सिफारिश करता हूं।

+5

वास्तव में अच्छी टिप्पणी। हमने एमआरसी से एआरसी तक हमारी बड़ी उद्यम परियोजना को माइग्रेट करने पर चर्चा की लेकिन हमें लगता है कि बड़ी परियोजनाओं या जटिल ऑब्जेक्ट मॉडल के साथ एमआरसी का उपयोग करना बेहतर है क्योंकि हमारे पास इसका नियंत्रण है। ज्यादातर मामलों में, हम मैन्युअल रूप से बनाए रखने/रिलीज़ भी नहीं करते हैं। हमने सब कुछ के लिए गुण बनाए रखा है और हम आवंटन के समय autorelease। लेकिन अब हर समय हमें एक स्थिति मिलती है जब हमें स्मृति पर प्रत्यक्ष नियंत्रण की आवश्यकता होती है। – Sulthan

+0

मैंने एक सप्ताह नहीं बिताया लेकिन दो दिन मेरे ओपनजीएल ईएस-आधारित 2 डी लाइब्रेरी को माइग्रेट कर रहा हूं और मैं आपको बता सकता हूं ... यदि आप सीधे इवर्स तक पहुंचते हैं (ओवरहेड से बचने के लिए, और क्योंकि आप जानते हैं कि आप क्या कर रहे हैं), तो आप बहुत सारे प्रतिनिधि फैले हुए हैं जिनके लिए आप __unsafe_unretained, आदि जोड़ना भूल गए हैं ... आप बहुत से बनाए रखने वाले चक्रों को कार्यान्वित कर सकते हैं, कार्यान्वित कर सकते हैं-डीएसएलओसी सिर्फ एक एनएसएलॉग जोड़ने के लिए यह देखने के लिए कि कोई ऑब्जेक्ट डिलीओटेड है, मेरे मामले में बहुत सारे सिरदर्द । उस एक्सकोड संगतता के मुद्दों में जोड़ें, सहायक में कीड़े, विफल माइग्रेशन ... –

+0

समय के लिए, मैं ** एआरसी को अपनाने वाला हूं लेकिन केवल छोटे, यूआईकिट-आधारित परियोजनाओं के लिए जहां मैं स्वयं का उपयोग कर सकता हूं। यह स्वयं यह हर समय और सब कुछ ऐप्पल के पूर्ववर्ती उपयोग मामलों में फिट बैठता है। –

1

आप CLANG_ENABLE_OBJC_ARC = NO लाभ के साथ इसे बंद/चालू करते हैं, आपको कम कोड लिखना है और मेमोरी प्रबंधन आसान है। नुकसान यह है कि आपको स्मृति प्रबंधन के बारे में जो कुछ भी आपने सीखा है उसे खरोंच करना होगा :) मैं इसे बंद करना पसंद करता हूं।

+0

यदि आप ARC –

+0

का उपयोग करते हैं तो एक छोटा प्रदर्शन दंड भी हो सकता है वास्तव में एआरसी आमतौर पर रनटाइम पर तेज़ होता है , अधिकतर क्योंकि ऑप्टिमाइज़र जितनी जल्दी हो सके ऑब्जेक्ट्स को रिलीज़ करता है, और यह ऑटोरेलीज पूल पर निर्भर करता है। – pchap10k

+2

यह उससे अधिक जटिल है। स्थिति के आधार पर एआरसी तेजी से * और * धीमी है। विशिष्ट परिणाम हैं: अधिक बनाए रखता है और रिलीज़ (धीमा), कम autoreleases (तेज, कम स्मृति)। यह जानने का एकमात्र तरीका है कि यह आपके विशेष कोड के लिए तेज़ या धीमा है या नहीं। –

0

आप एआरसी को "एडिट-> रिफैक्टर-> कन्वर्ट टू ऑब्जेक्टिव सी आर्क" के माध्यम से चालू कर सकते हैं, यह आपके कोड को पूरी तरह से दोहराएगा (सभी मेमोरी प्रबंधन कॉल से छुटकारा पाएं)। कोई प्रतिकूल ऑपरेशन नहीं है इसलिए सुनिश्चित करें कि यदि आपके पास दूसरे विचार हैं तो आपको स्रोत नियंत्रण में चीजें मिल गई हैं। This post आपको दिखाता है कि इसे विशिष्ट फ़ाइलों के लिए कैसे अक्षम करें। मुझे नहीं लगता कि इस तथ्य को अलग करने के लिए बहुत अधिक तर्क नहीं दिया जा रहा है कि इस मेकअप को अच्छे मेमोरी प्रबंधन में डालने के लिए दर्द होता है और हमें छत पर कूदना बंद करना होगा प्रत्येक बार जब हम init, new, एक संबंधित रिलीज/autorelease के बिना प्रतिलिपि देखते हैं (और यह कुछ उपयोग करने में लगेगा)। शायद यह तर्क दिया जा सकता है कि कुछ परिस्थितियों में मैन्युअल मेमोरी प्रबंधन के परिणाम वास्तव में ध्यान देने योग्य प्रदर्शन/मेमोरी पदचिह्न सुधार में होते हैं, यदि ऐसा है तो मुझे भी दिलचस्पी होगी।

0

मैं शेर और xcode 4.3 का उपयोग कर रहा हूं। मुझे एक ही समस्या थी।

इसे ठीक करने के लिए मैंने "बिल्ड सेटिंग्स-> उद्देश्य-सी स्वचालित संदर्भ सह" को "नहीं" में बदल दिया।

यह देखने के लिए कि यह "हां" पर सेट किया गया था, मुझे टूलबार पर "सभी" और "स्तर" विकल्प भी सक्षम करना था जो "बिल्ड सेटिंग्स" टूलबार के ठीक नीचे है।

एक बार उन विकल्पों को सक्षम करने के बाद मैं देख सकता था कि मेरे प्रोजेक्ट में यह विकल्प "हां" पर सेट था। मुझे यह समझने में थोड़ी देर लग गई कि डिफ़ॉल्ट सेटिंग "नहीं" थी, जो तब तक प्रदर्शित होती है जब तक कि मैंने "स्तर" विकल्प सक्षम नहीं किया।

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