2012-03-06 11 views
12

के बाद गुणों और आइवरों के साथ बदलें मैंने एक्सकोड 4.0 में शुरू की गई परियोजना को एआरसी का उपयोग करने के लिए एक्सकोड 4.0 में शुरू की गई परियोजना को बदलने के लिए "ऑब्जेक्टिव सी एआरसी में कनवर्ट करें" विकल्प का उपयोग किया है। उपकरण को मिली त्रुटियों को ठीक करने के बाद, मैं उस प्रक्रिया को कम कर देता हूं जहां माइग्रेशन टूल ने सभी रिलीज़ संदेशों को हटा दिया है और साथ ही साथ मेरे गुणों की घोषणाओं में विशेषताओं को बनाए रखा है। तो अब मेरे पास मेरे सभी गुण हैं जिनमें केवल (nonatomic) विशेषता है। प्रलेखन पढ़ने से मुझे अभी भी स्पष्ट जवाब नहीं है कि क्या करना है।एआरसी माइग्रेशन

तो मेरा प्रश्न है: यदि आप संपत्ति घोषणा में सेटटर अर्थशास्त्र (मजबूत, कमजोर, बनाए रखने, असाइन) के संबंध में कीवर्ड को छोड़ देते हैं, तो एआरसी का उपयोग करते समय गुणों पर डिफ़ॉल्ट विशेषता क्या होती है?

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

मेरे प्रश्न को बेहतर तरीके से समझाने के लिए, यहां एक उदाहरण है। मैं फ़ाइल शीर्षक हम घोषणा की है:

@property (nonatomic) MyClass *objectToUse; 

और हमारे कार्यान्वयन में हम सिर्फ

@synthesize objectToUse; 

है हम तो कुछ विधि के अंदर लिखते हैं:

self.objectToUse = [[MyClass alloc] init]; 

हम एक मजबूत बनाया है (बनाए रखें) या कमजोर (असाइन) संदर्भ? यदि हम इसके बजाय

objectToUse = [[MyClass alloc] init]; 

ivar का उपयोग करके हमने ऑब्जेक्ट प्रतिधारण नीति के बारे में स्थिति बदल दी है? ऐसा लगता है कि अब एआरसी के साथ, स्मृति प्रबंधन के लिए गुणों का उपयोग करने का सबसे अच्छा अभ्यास अब एक ही अभ्यास नहीं है।

उत्तर

16

मैंने तकनीकी सहायता घटना खोली है। इंजीनियर ने सत्यापित किया कि डिफ़ॉल्ट "असाइन" से "मजबूत" में बदल दिया गया था। कारण वास्तव में आपके द्वारा वर्णित असंगतता है। अब ivars और @properties एक ही डिफ़ॉल्ट है।

उन्होंने कहा कि दोनों दस्तावेज (और कुछ लोगों को चेतावनियां) गलत हैं और तय की जाएंगी। (रूपांतरण उपकरण सही है।) जब तक यह नहीं किया जाता है, तो मैं अंतर्निहित डिफ़ॉल्ट से पूरी तरह से बचूंगा। हमेशा स्पष्ट रूप से "मजबूत", "कमजोर", या "असाइन करें" निर्दिष्ट करें।

संपादित करें: clang documentation अब आधिकारिक तौर पर इस परिवर्तन को दस्तावेज करता है।

7

डिफ़ॉल्ट संबंध प्रकार अभी भी assign है, यानी एक कमजोर रेफरी। इसके अलावा, एआरसी मोड में कंपाइलर त्रुटि उत्पन्न करेगा जब @synthesize आईएनजी एक्सेसर्स जब तक आप स्पष्ट रूप से रिलेशनशिप प्रकार निर्दिष्ट नहीं करते हैं।

self.objectToUse और objectToUse को बताए के बीच अंतर यह है कि दूसरा रूप हमेशा की तरह, retain या assign लिए एआरसी का उपयोग करेगा अगर आप एक copy संबंध निर्दिष्ट करते हुए पहला रूप copy प्रयोग करेंगे।

+0

यह देखते हुए कि एआरसी माइग्रेशन ने अपनी संपत्ति घोषणाओं से 'बनाए रखने' विशेषता को हटा दिया है, क्या यह संभव है कि एक्सकोड 4.3 के रूप में डिफ़ॉल्ट 'मजबूत' हो गया हो? मेरे पास अभी परीक्षण करने के लिए कंप्यूटर नहीं है, लेकिन यह मुझे आश्चर्य नहीं करेगा। –

+0

यह वास्तव में मुझे भ्रमित करता है, क्योंकि सभी 'बनाए रखने' गुणों को एआरसी द्वारा हटाया जा रहा है जो 'एंट्री' (डिफ़ॉल्ट रूप से) वाले सभी गुणों को छोड़ देता है जिसका अर्थ है कि एआरसी माइग्रेशन के बाद आपको अपनी सभी संपत्ति घोषणाओं को कम करना होगा और जोड़ना होगा एक ही व्यवहार करने के लिए 'मजबूत' विशेषता। यह दिलचस्प है कि 'असाइन' विशेषता वाले प्रतिनिधियों को 'unsafe_unretained' में बदल दिया गया है, जो ठीक है, लेकिन क्या यह संभव है कि' बनाए रखने 'को स्वचालित रूप से 'strong' में बदला नहीं जा सके? – Luka

+0

मेरे लिए माइग्रेटर में एक बग की तरह दिखता है। मुझे लगता है कि एक्सकोड 4.2 –