ARC के साथ @property की परिभाषा: मजबूत या बरकरार?


80

Xcode 4.2 और ARC का उपयोग करते हुए, मैं नोटिस करता हूं कि NSManagedObjectअभी भी संपत्तियों के लिए ऑटो-जनरेटेड कोड इस तरह से पढ़ता है:

@property (nonatomic, retain) NSString * someString;

1) retainअब strongया के साथ प्रतिस्थापित नहीं किया जाना चाहिए weak?

2) ऑटो-जनरेट कोड अभी भी क्यों उपयोग करता है retain

3) retainइस संपत्ति के बयान में सही प्रतिस्थापन क्या है ?

मैं वर्तमान में एक समस्या का उपयोग कर डिबगिंग कर रहा हूं NSFetchRequest, और मुझे लगा कि यह समस्या का स्रोत हो सकता है। विचार?


आपको अब तक इसका जवाब स्वीकार कर लेना चाहिए।
रिवर

जवाबों:


110

1) बरकरार नहीं होना चाहिए अब मजबूत या कमजोर के साथ प्रतिस्थापित किया जाना चाहिए?

नहीं। आप कमजोर के साथ बनाए रखने की जगह नहीं ले सकते; वे भिन्न हैं। और मजबूत बनाए रखने के लिए एक 100% पर्याय है; वे समान हैं। आप या तो उपयोग कर सकते हैं, इसलिए यहां "नहीं" होना चाहिए। यदि आप चाहें, तो आप मजबूत के साथ बनाए रख सकते हैं, लेकिन आपके पास नहीं है।

2) ऑटो-जनरेट कोड अभी भी रिटेन का उपयोग क्यों करता है

क्यों नहीं? देखें (1)। बनाए रखना सही है इसलिए कोई समस्या नहीं है।

3) इस संपत्ति के बयान में बनाए रखने के लिए सही प्रतिस्थापन क्या है?

रिटेन को बदलने की कोई आवश्यकता नहीं है।

मैं वर्तमान में NSFetchRequest का उपयोग करके किसी समस्या को डीबग कर रहा हूं, और मुझे लगा कि यह समस्या का स्रोत हो सकता है। विचार?

यह नहीं है।


9
मैं हालांकि, एक समुदाय के लिए जुनून (और सही तो!) मानकों और अनुपालन के साथ Apple वे (ओं) के रूप में प्रस्तुत करना चाहता हूँ, केवल संश्लेषित मॉडल में बनाए रखना देखकर सबपर है। मैं मजबूत होकर सिर्फ पांडित्य में बदलता हूं। एक के लिए, आधा दर्जन अन्य छोटी चीजों के बीच अनुचित सिंटैक्स के लिए एक बड़ी परियोजना को एक आसान-सा बनाता है।
एरिक गोल्डबर्ग

12
निश्चित नहीं कि भावनात्मक वास्तुकला क्या है। क्या आप "दिन के ठंडे, स्पष्ट प्रकाश" में एक उदाहरण प्रदान कर सकते हैं? ;-) असत्य और सं पर्यायवाची शब्द हैं, लेकिन हम उद्देश्य-सी में सम्मेलन द्वारा NO का उपयोग करते हैं। लगातार होने के कारण हैं; असंगत होना ठीक है, लेकिन योग्यता साबित करने का बोझ एक को तोड़ने वाले सम्मेलन पर है, न कि इसका पालन करने वाले पर।
एरिक गोल्डबर्ग

9
सभी उचित सम्मान के साथ, @ EricGoldberg के पास एक बिंदु है: सम्मेलन के मामले। और क्योंकि आप __strongअपने कोड में अन्य स्थानों पर होने जा रहे हैं (कोई नहीं है __retain) आप strongस्थिरता के लिए उपयोग करना चाहते हैं । यह आपके कोड को सुसंगत तरीके से इंडेंट करने के समान है, भले ही कोड इसके बिना ठीक चलेगा।
दान रोसेनस्टार्क

3
@matt: यदि आप मेरी मूल टिप्पणी को देखते हैं, तो जिस पर आपने मुझ पर "भावनात्मक रूप से" (जो कुछ भी है) कोडिंग का आरोप लगाया है, आप देखेंगे कि मैं "सकारात्मक" और "सिर्फ पांडित्यपूर्ण" शब्दों का उपयोग करता हूं। मैं वास्तव में सुझाव देता हूं कि "" चाहिए "और" नहीं है।
एरिक गोल्डबर्ग

1
प्रचार के सभी मुहावरे के बारे में है। कोई अन्य मुद्दे नहीं हैं। सभी प्रोग्रामिंग एक पर्यायवाची है, प्रोग्रामिंग का पूरा इंजीनियरिंग अभ्यास वर्तमान मुहावरे का उपयोग करने के बारे में है, ताकि क्लाइंट के लिए कोड में मूल्य को जोड़ा जा सके।
फटी

40

एक में सभी तीन सवालों के जवाब देने के लिए: retainऔर strongएक दूसरे के पर्याय हैं, इसलिए दोनों सही हैं। दस्तावेज में कहा गया है

retainतात्पर्य __strongस्वामित्व से है

strongतात्पर्य __strongस्वामित्व से है


जवाब के लिए धन्यवाद। मैंने ARC पर Apple दस्तावेज़ पढ़ा। मैं समझता हूं कि अनुवाद मजबूत बनाए रखता है। हालाँकि, यह स्पष्ट नहीं करता है कि नया NSManagedObject (s) बनाते समय Xcode द्वारा स्वचालित रूप से उत्पन्न होने वाला कोड आपको @property (गैर
परमाणु

3
जब तक मैं यहाँ कुछ याद नहीं कर रहा हूँ, यह पूरी तरह से समझाता है। कोड जो Xcode बनाता है वह सही है क्योंकि रिटेन काम करता है बस मजबूत है, तो आपका सवाल कहां है?
फूलबो

6
यदि आप अपने प्रोजेक्ट पर ARC रिफैक्टरिंग चलाते हैं, तो यह उन सभी retains को strongs में बदल देगा । इसलिए मेरी धारणा यह है कि strongपसंदीदा विशेषता है, लेकिन NSManagedObject जनरेटर को अपडेट नहीं किया गया है। लेकिन यह सिर्फ एक अनुमान है; शायद Apple में कोई भी इस भेद को महत्वपूर्ण नहीं मानता है।
सिद्धांत

4

एआरसी से पहले, आपको एक ऑब्जेक्ट को 'जारी' करना होगा। इसका मतलब है कि रिटेन में काउंटर पार्ट है। एआरसी के बाद आपको रिहा करने की आवश्यकता नहीं है। इसलिए मजबूत का उपयोग करें। यह एक दृश्य सुराग है कि आपको रिलीज को कॉल करने की आवश्यकता नहीं है।


3

"बनाए रखना" "मजबूत" के बराबर है।

"मजबूत" का उपयोग उदाहरण के लिए किया जाता है:

@property (nonatomic, strong) NSString * someString;

और "__strong" का उपयोग उदाहरण के लिए किया जाता है:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

Apple डॉक्स पर। कहते हैं:

संपत्ति गुण

कमजोर और मजबूत कीवर्ड को नई घोषित संपत्ति विशेषताओं के रूप में पेश किया जाता है, जैसा कि निम्नलिखित उदाहरणों में दिखाया गया है।

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

सेब डॉक। http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

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