कोई नकारात्मक पहलू नहीं है। इसका इस्तेमाल करें। इसे आज करो। यह आपके पुराने कोड से तेज है। यह आपके पुराने कोड से अधिक सुरक्षित है। यह आपके पुराने कोड की तुलना में आसान है। यह कचरा संग्रह नहीं है। इसमें कोई जीसी रनटाइम ओवरहेड नहीं है। संकलक आवेषण सभी स्थानों पर आपको बनाए रखता है और जारी रखता है, वैसे भी आपके पास होना चाहिए। लेकिन यह आपकी तुलना में अधिक स्मार्ट है और उन लोगों को अनुकूलित कर सकता है जिनकी वास्तव में ज़रूरत नहीं है (जैसे यह लूप को अनियंत्रित कर सकता है, अस्थायी चर को समाप्त कर सकता है, इनलाइन फ़ंक्शन आदि)
ठीक है, अब मैं आपको छोटे डाउनसाइड के बारे में बताऊंगा:
यदि आप लंबे समय से ओबजेक डेवलपर हैं, तो आप एआरसी कोड को देखते हुए एक सप्ताह के लिए जुड़ जाएंगे। आप बहुत जल्दी इस पर काबू पा लेंगे।
कोर फाउंडेशन कोड के लिए ब्रिजिंग में कुछ (बहुत) छोटी जटिलताएं हैं। कुछ के साथ व्यवहार करने में थोड़ी अधिक जटिलताएं हैं जो एक के id
रूप में व्यवहार करता है void*
। C-arrays जैसी चीजें id
सही तरीके से करने के बारे में थोड़ा और सोच सकती हैं। ObjC की फैंसी हैंडलिंग va_args
भी परेशानी का कारण बन सकती है। एक ओब्जेसी पॉइंटर पर गणित से जुड़ी ज्यादातर चीजें पेचीदा होती हैं। आपके पास किसी भी मामले में ऐसा नहीं होना चाहिए।
आप एक नहीं डाल सकते id
एक में struct
। यह काफी दुर्लभ है, लेकिन कभी-कभी इसका उपयोग डेटा पैक करने के लिए किया जाता है।
यदि आपने सही केवीसी नामकरण का पालन नहीं किया है, और आप एआरसी और गैर-एआरसी कोड को इंटरमिक्स करते हैं, तो आपको मेमोरी समस्याएं होंगी। ARC मेमोरी प्रबंधन के बारे में निर्णय लेने के लिए KVC नामकरण का उपयोग करता है। यदि यह सभी एआरसी कोड है, तो इससे कोई फर्क नहीं पड़ता क्योंकि यह दोनों तरफ एक ही "गलत" करेगा। लेकिन अगर यह एआरसी / गैर-एआरसी मिश्रित है तो एक बेमेल है।
ARC ObjC अपवाद थ्रो के दौरान मेमोरी को लीक करेगा। आपके कार्यक्रम की समाप्ति के समय में एक ओब्जेक अपवाद बहुत करीब होना चाहिए। यदि आप ObjC अपवादों की एक महत्वपूर्ण संख्या को पकड़ रहे हैं, तो आप उन्हें गलत तरीके से उपयोग कर रहे हैं। यह उपयोग करने योग्य है -fobjc-arc-exceptions
, लेकिन यह नीचे उल्लिखित दंड को लागू करता है:
ARC ObjC या C ++ के दौरान मेमोरी को लीक नहीं करेगा ObjC ++ कोड में अपवाद फेंकता है, लेकिन यह समय और स्थान प्रदर्शन दोनों की लागत पर है। यह ObjC ++ के आपके उपयोग को कम करने के कारणों की लंबी सूची में एक और है।
ARC iPhoneOS 3 या Mac OS X 10.5 या इससे पहले के सभी पर काम नहीं करेगा। (यह मुझे कई परियोजनाओं में एआरसी का उपयोग करने से रोकता है।)
__weak
आईओएस 4 या मैक ओएस एक्स 10.6 पर पॉइंटर्स सही तरीके से काम नहीं करते हैं, जो एक शर्म की बात है, लेकिन आसपास काम करना काफी आसान है। __weak
संकेत महान हैं, लेकिन वे एआरसी के # 1 विक्रय बिंदु नहीं हैं।
वहाँ से बाहर 95% + के लिए, एआरसी शानदार है और इससे बचने के लिए कोई कारण नहीं है (बशर्ते आप ओएससी प्रतिबंधों को संभाल सकते हैं)। गैर-एआरसी कोड के लिए, आप -fno-objc-arc
फ़ाइल-दर-फ़ाइल आधार पर पास कर सकते हैं । एक्सकोड दुर्भाग्य से इसे बहुत कठिन बना देता है जितना अभ्यास में करना चाहिए। आपको इसे सरल बनाने के लिए संभवत: गैर-एआरसी कोड को एक अलग xcodeproj में स्थानांतरित करना चाहिए।
अंत में, जितनी जल्दी हो सके एआरसी पर स्विच करें और कभी भी पीछे मुड़कर न देखें।
संपादित करें
मैंने "एआरसी का उपयोग करते हुए कोको मेमोरी मैनेजमेंट नियमों को जानने के लिए कोई विकल्प नहीं है" की तर्ज पर कुछ टिप्पणियों को देखा है। यह ज्यादातर सच है, लेकिन यह समझना महत्वपूर्ण है कि क्यों और क्यों नहीं। सबसे पहले, यदि आपका सभी कोड ARC का उपयोग करता है, और आप तीन मैजिक वर्ड का उल्लंघन करते हैंसभी जगह, आपको अभी भी कोई समस्या नहीं है। कहने के लिए चौंक, लेकिन तुम वहाँ जाओ। एआरसी कुछ चीजों को बनाए रख सकती है, जिनका मतलब यह नहीं था कि आप इसे बनाए रखेंगे, लेकिन यह उन्हें भी जारी कर देगा, इसलिए यह कभी भी मायने नहीं रखेगा। अगर मैं आज कोको में एक नया वर्ग पढ़ा रहा था, तो मैं शायद वास्तविक स्मृति प्रबंधन नियमों पर पांच मिनट से अधिक नहीं बिताऊंगा, और मैं शायद केवीसी नामकरण पर चर्चा करते हुए केवल स्मृति प्रबंधन नामकरण नियमों का उल्लेख करूंगा। एआरसी के साथ, मेरा मानना है कि आप वास्तव में स्मृति प्रबंधन नियमों को सीखने के बिना एक सभ्य शुरुआत प्रोग्रामर बन सकते हैं।
लेकिन आप एक सभ्य मध्यवर्ती प्रोग्रामर नहीं बन सकते। कोर फाउंडेशन के साथ सही ढंग से काम करने के लिए आपको नियमों को जानने की जरूरत है, और प्रत्येक मध्यवर्ती प्रोग्रामर को कुछ बिंदु पर सीएफ से निपटने की आवश्यकता है। और आपको मिश्रित-एआरसी / एमआरसी कोड के नियमों को जानना होगा। और आपको नियमों को जानने की आवश्यकता है जब आप void*
पॉइंटर्स के साथ गड़बड़ करना शुरू करते हैं id
(जिसे आपको केवीओ को सही ढंग से निष्पादित करने की आवश्यकता है)। और ब्लॉक ... ठीक है, ब्लॉक मेमोरी प्रबंधन सिर्फ अजीब है।
तो मेरा कहना यह है कि अंतर्निहित मेमोरी प्रबंधन अभी भी महत्वपूर्ण है, लेकिन जहां मैं नए प्रोग्रामरों के लिए नियमों को बताते हुए और उन्हें बहाल करने में महत्वपूर्ण समय बिताता था, एआरसी के साथ यह एक अधिक उन्नत विषय बन रहा है। मैं नए डेवलपर्स को ऑब्जेक्ट ग्राफ़ के संदर्भ में सोचने के बजाय अंतर्निहित कॉल के साथ अपना सिर भरने के लिए मिलूंगा objc_retain()
।