IOS5 SDK में ऑटोमैटिक रेफरेंस काउंटिंग के बारे में कुछ सवाल


134

मैं वर्तमान में iPad के लिए एक ऐप विकसित कर रहा हूं। IOS 4.2 के लिए विकास शुरू हुआ और अब iOS 4.3 के लिए जारी है (और मुझे लगता है कि पूरा हो जाएगा)। मैंने अभी iOS 5 में ARC के बारे में पढ़ा, और मूल रूप से मुझे समझ में आया कि हमें अब वस्तुओं को जारी करने और बनाए रखने की आवश्यकता नहीं होगी। मेरे प्रश्न हैं:

  1. अगर मैं iOS 5 में अपग्रेड करने का फैसला करता हूं, तो क्या मुझे अपने कोड से सभी [myObject retain]और [myObject release]स्टेटमेंट निकालने की जरूरत है ?

  2. अगर मैं ARC का उपयोग करके iOS 5 के लिए एक नया ऐप विकसित करता हूं, तो क्या मुझे कुछ प्रकार के "रेट्रो-कम्पैटिबिलिटी" चेक लागू करने की आवश्यकता होगी? यानी: क्या मुझे आईओएस के संस्करण की जांच करने और कॉल रिटेन करने और तदनुसार रिलीज करने की आवश्यकता होगी? तो, मूल रूप से, एआरसी सभी iOS संस्करणों के लिए या सिर्फ iOS 5 के लिए उपलब्ध है?

जवाबों:


150

अगर मैं iOS 5 में अपग्रेड करने का निर्णय लेता हूं, तो क्या मुझे अपने कोड से सभी [myObject रिटेन] और [myObject रिलीज़] स्टेटमेंट निकालने की आवश्यकता है?

हां, लेकिन XCode 4.2 में एक नया "माइग्रेट टू ऑब्जेक्टिव-सी एआरसी" टूल (एडिट-> रिफ्लेक्टर मेनू) शामिल है, जो आपके लिए ऐसा करता है। डीललोक बुलाना एक अलग कहानी है। जैसा कि टिप्पणियों में उल्लेख किया गया है कि क्लैंग संदर्भ में कहा गया है कि आपको अपना डीललोक तरीका रखना चाहिए:

औचित्य: भले ही एआरसी उदाहरण चर को स्वचालित रूप से नष्ट कर देता है, लेकिन अभी भी एक वैध तरीके को लिखने के लिए वैध कारण हैं, जैसे गैर-अनुरक्षित संसाधनों को मुक्त करना। ऐसी विधि में [सुपर डीलॉक] बुलाने में विफल होना लगभग हमेशा एक बग है।

आप ARC को नए -fobjc- आर्क कंपाइलर ध्वज का उपयोग करने में सक्षम करते हैं। ARC को Mac OS X v10.6 और v10.7 (64-बिट एप्लिकेशन) और iOS 4 और iOS 5. के लिए Xcode 4.2 में समर्थित किया गया है (Mac OS X v10.6 और iOS 4 में कमजोर संदर्भों का समर्थन नहीं किया गया है)। Xcode 4.1 में ARC सपोर्ट नहीं है।

-

अगर मैं ARC का उपयोग करके iOS 5 के लिए एक नया ऐप विकसित करता हूं, तो क्या मुझे कुछ प्रकार के "रेट्रो-कम्पैटिबिलिटी" चेक लागू करने की आवश्यकता होगी? Ie: क्या मुझे iOS के संस्करण की जांच करने और तदनुसार कॉल रिटेन करने और रिलीज़ करने की आवश्यकता होगी? तो, मूल रूप से, एआरसी सभी iOS संस्करणों के लिए या सिर्फ iOS 5 के लिए उपलब्ध है?

नहीं, क्योंकि एआरसी संकलन के समय पर अपना जादू चलाती है न कि रन टाइम पर।

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

ARC पर अधिक जानकारी: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


आपके विवरण के लिए धन्यवाद!
ल्यूक 47

4
यह 100% सही नहीं है। एक कंपाइलर स्विच है जो निर्धारित करता है कि एआरसी सक्षम है या नहीं। इसके अलावा, ARC को कुछ रनटाइम सपोर्ट की जरूरत है, मेरा मानना ​​है कि अगर आप चाहते हैं कि आपका ऐप iOS 4.x पर काम करे तो आपको अपने रिटर्न्स और रिलीज़ को छोड़ना होगा और सुनिश्चित करना होगा कि ARC स्विच ऑफ हो।
जेरेमीप

8
@JeremyP - iOS 4.0 वास्तव में ARC अनुप्रयोगों के लिए एक लक्ष्य के रूप में समर्थित है, इसलिए उस पुराने प्लेटफॉर्म को संबोधित करने के लिए मैन्युअल संदर्भ गिने हुए कोड रखने की कोई आवश्यकता नहीं है। iPhone OS 3.x शायद, लेकिन मुझे लगता है कि Apple ने 5.0 जहाज एक बार लक्ष्य मंच के रूप में उस के लिए समर्थन बंद कर सकता है, जैसे कि उन्होंने 4.0 के लिए किया था जब 4.0 बाहर आया था।
ब्रैड लार्सन

5
@ ब्रैड iOS4 के लिए इंस्टॉल बेस पहले से ही 95% से अधिक है। मुझे लगता है कि यह वैसे भी iOS3 समर्थन को बचाने के लिए बचा है।
हेनरिक पी। हेसल

2
आप नहीं हटाते हैं dealloc, आप केवल अपने सभी को हटाते हैं releaseऔर [super dealloc]इससे। और 99.9% में deallocसिर्फ वस्तुओं को छोड़ता है, इसलिए आप इसे हटा देते हैं। लेकिन वस्तुओं को अभी भी अन्य साफ-सुथरे कार्यों को करना पड़ता है जो नहीं हैं release(फाइलें बंद करना, पर्यवेक्षकों को हटाना आदि)।
स्टानिस्लाव याग्लो

8

Q1: NO, यदि आपके पास कोई मौजूदा कोड है, तो आप इसका उपयोग कर सकते हैं जैसा कि -fno-objc-arc के साथ आप किसी भी फ़ाइल पर ARC को चुनिंदा रूप से अक्षम कर सकते हैं।

यदि आप MULTIPLE फ़ाइलों पर ARC को अक्षम करना चाहते हैं :

  1. Xcode में टारगेट / बिल्ड फेज / कम्पाइल सोर्स के वांछित फाइल का चयन करें
  2. प्रेस दर्ज करें । (डबल क्लिक केवल एक फ़ाइल का चयन करता है)
  3. टाइप -fno-objc- चाप
  4. प्रेस दर्ज करें या हो गया

Q2: नहीं, लक्ष्य iOS 4.0 जितना कम हो सकता है


7

जहाँ तक मैं समझता हूँ और जहाँ तक मेरा iPhone / iPod क्रमशः iOS 5 और iOS 4.3 चला रहा है, यह सब काफी स्वचालित है। एक ऐप जो मैंने 4.0 के लिए शुरू किया था और iOS 5.0 के लिए Xcode के साथ काम करने के लिए "अपडेट" किया है, किसी भी तरह की चेतावनी को जारी करने और बनाए रखने के बारे में कभी भी नहीं फेंकता है, भले ही यह हर डीललोक पर हो, आदि। हालांकि, कुछ समान कोड मैंने डाले। ( IOS 5 के लिए Xcode के साथ बनाई गई एक नई परियोजना में फ़ाइल की प्रतिलिपि बनाई गई) कई, कई चेतावनियाँ हैं। ऐसा प्रतीत होता है कि आपको उन सभी कॉल्स को हटाने की आवश्यकता नहीं है, और नहीं, यह किसी भी तरह पुराने संस्करणों के लिए स्वचालित रूप से इसे अनुकूलित करता है। मेरे iPod को प्रोफाइल करते हुए, मुझे कोई मेमोरी लीक या असफल डील / रिलीज के अन्य लक्षण दिखाई नहीं दे रहे हैं। क्या यह मदद करता है?


नवीनतम बीटा संस्करण वास्तव में मुझे सभी आवंटन कॉल हटाने के लिए प्रेरित करता है, और इसके बारे में है। आप अभी भी बनाए रख सकते हैं / जारी कर सकते हैं लेकिन सिस्टम में अंतिम शब्द है।
डायलन गाट्टी

5

अपने सवाल के इस हिस्से के बारे में

अगर मैं ARC का उपयोग करके iOS 5 के लिए एक नया ऐप विकसित करता हूं, तो क्या मुझे कुछ प्रकार के "रेट्रो-कम्पैटिबिलिटी" चेक लागू करने की आवश्यकता होगी? Ie: क्या मुझे iOS के संस्करण की जांच करने और तदनुसार कॉल रिटेन करने और रिलीज़ करने की आवश्यकता होगी? तो, मूल रूप से, एआरसी सभी iOS संस्करणों के लिए या सिर्फ iOS 5 के लिए उपलब्ध है?

यह ध्यान दिया जाना चाहिए कि iOS 5 कंपाइलर "रेट्रो-कम्पैटिबिलिटी" लेता है (यह वास्तव में कोड को बनाए रखने / जारी करने के लिए काम करता है, अनिवार्य रूप से), लेकिन अगर आप iOS 5.0 के लिए संकलन नहीं कर रहे हैं, तो आप weakएक कीवर्ड के रूप में उपयोग नहीं कर सकते हैं। । इसके बजाय आप का उपयोग करें assign। यह दुर्भाग्यपूर्ण है: weakएक बहुत बड़ा फायदा है (कोई झूलने की बात नहीं है, कभी भी!)। मेरे सवाल देखें यहाँ की चर्चा के लिए weak, assignऔर एआरसी।


2

यदि आप नए -fobjc- आर्क कंपाइलर ध्वज का उपयोग नहीं करके ARC को अक्षम कर सकते हैं, तो आपको आगे बढ़ने वाले कोड को फिर से लिखने के लिए मजबूर नहीं किया जाता है - मुझे लगता है (?)

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