सवाल परमाणु और nonatomic विशेषताओं के बीच क्या अंतर है?


क्या करना है atomic तथा nonatomic संपत्ति घोषणाओं में मतलब है?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

इन तीनों के बीच परिचालन अंतर क्या है?


1723
2018-02-26 02:31


मूल


developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/... - KKendall
@ एलेक्स वेन - मुझे एक समस्या है और मैंने इसे पोस्ट किया है लेकिन किसी ने इसका उत्तर नहीं दिया है। तो क्या आप इसके लिए मेरी मदद कर सकते हैं। प्रश्न लिंक - stackoverflow.com/questions/35769368/... - DJ1


जवाब:


अंतिम दो समान हैं; "परमाणु" डिफ़ॉल्ट व्यवहार है (ध्यान दें कि यह वास्तव में एक कीवर्ड नहीं है; यह केवल अनुपस्थिति से निर्दिष्ट है nonatomic - atomic llvm / clang के हाल के संस्करणों में एक कीवर्ड के रूप में जोड़ा गया था)।

यह मानते हुए कि आप विधि कार्यान्वयन को संश्लेषित कर रहे हैं, परमाणु बनाम गैर-परमाणु जेनरेट कोड बदलते हैं। यदि आप अपना खुद का सेटर / गेटर्स लिख रहे हैं, परमाणु / nonatomic / retain / असाइन / कॉपी केवल सलाहकार हैं। (नोट: @ सिंथेसाइज अब एलएलवीएम के हाल के संस्करणों में डिफ़ॉल्ट व्यवहार है। इंस्टेंस चर घोषित करने की कोई आवश्यकता नहीं है; उन्हें स्वचालित रूप से संश्लेषित भी किया जाएगा, और आपके पास एक होगा _ आकस्मिक प्रत्यक्ष पहुंच को रोकने के लिए उनके नाम पर प्रीपेड किया गया)।

"परमाणु" के साथ, संश्लेषित सेटटर / गेटर यह सुनिश्चित करेगा कि ए पूरा का पूरा मूल्य किसी भी अन्य धागे पर सेटटर गतिविधि के बावजूद, गेटर से सेट या सेटटर द्वारा सेट किया जाता है। यही है, अगर थ्रेड ए गेटटर के बीच में है, जबकि थ्रेड बी सेटटर को कॉल करता है, एक वास्तविक व्यवहार्य मूल्य - एक ऑटोरेलेज्ड ऑब्जेक्ट, सबसे अधिक संभावना - कॉलर को ए में वापस कर दिया जाएगा।

में nonatomic, ऐसी कोई गारंटी नहीं दी जाती है। इस प्रकार, nonatomic "परमाणु" से काफी तेज है।

क्या "परमाणु" करता है नहीं थ्रेड सुरक्षा के बारे में कोई गारंटी है। यदि थ्रेड ए थ्रेड बी और सी के साथ एक साथ गेटर को अलग-अलग मानों के साथ बुला रहा है, तो थ्रेड ए को वापस दिए गए तीन मानों में से कोई एक प्राप्त हो सकता है - किसी भी सेटर्स से पहले या सेटर्स में पास किए गए मानों में से एक बी और सी में इसी तरह, वस्तु बी या सी के मूल्य के साथ समाप्त हो सकती है, बताने का कोई तरीका नहीं है।

डेटा अखंडता सुनिश्चित करना - बहु-थ्रेडेड प्रोग्रामिंग की प्राथमिक चुनौतियों में से एक - अन्य माध्यमों द्वारा हासिल किया जाता है।

इसमें जोड़ना:

atomicity एक ही संपत्ति का भी थ्रेड सुरक्षा की गारंटी नहीं दे सकता है जब एकाधिक निर्भर गुण खेल रहे हैं।

विचार करें:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

इस मामले में, थ्रेड ए ऑब्जेक्ट को कॉल करके ऑब्जेक्ट का नाम बदल सकता है setFirstName: और फिर बुलाओ setLastName:। इस बीच, थ्रेड बी कॉल कर सकते हैं fullName थ्रेड ए के दो कॉल के बीच में और पुराने अंतिम नाम के साथ नया पहला नाम प्राप्त होगा।

इसे संबोधित करने के लिए, आपको एक की आवश्यकता है लेनदेन मॉडल। अर्थात। कुछ अन्य प्रकार के सिंक्रनाइज़ेशन और / या बहिष्करण जो किसी को एक्सेस को बाहर करने की अनुमति देता है fullName जबकि निर्भर गुणों को अद्यतन किया जा रहा है।


1668
2018-02-26 06:40



यह देखते हुए कि कोई थ्रेड-सुरक्षित कोड अपना लॉकिंग आदि कर रहा है, आप परमाणु संपत्ति एक्सेसर्स का उपयोग कब करना चाहते हैं? मुझे एक अच्छा उदाहरण सोचने में परेशानी हो रही है। - Daniel Dickison
@bbum समझ में आता है। मुझे आपकी टिप्पणी किसी अन्य उत्तर में पसंद है कि थ्रेड-सुरक्षा एक मॉडल-स्तरीय चिंता है। एक आईबीएम धागा सुरक्षा परिभाषा से: ibm.co/yTEbjY "यदि एक वर्ग सही तरीके से लागू किया गया है, तो यह कहने का एक और तरीका है कि यह इसके विनिर्देश के अनुरूप है, उस वर्ग की वस्तुओं पर संचालन का कोई अनुक्रम (सार्वजनिक क्षेत्रों के पढ़ने या लिखने और सार्वजनिक तरीकों के लिए कॉल) वस्तु को रखने में सक्षम होना चाहिए किसी अमान्य स्थिति में, किसी अमान्य स्थिति में होने के लिए ऑब्जेक्ट का निरीक्षण करें, या किसी वर्ग के इनवेरिएंट, पूर्व शर्त, या पोस्टकंडिशन का उल्लंघन करें। " - Ben Flynn
यहां @StevenKramer के समान उदाहरण है: मेरे पास एक है @property NSArray* astronomicalEvents; जो उस डेटा को सूचीबद्ध करता है जिसे मैं यूआई में प्रदर्शित करना चाहता हूं। जब एप्लिकेशन पॉइंटर पॉइंट को रिक्त सरणी में लॉन्च करता है, तो ऐप वेब से डेटा खींचता है। जब वेब अनुरोध पूरा होता है (एक अलग थ्रेड में) ऐप एक नई सरणी बनाता है तो परमाणु रूप से संपत्ति को एक नए सूचक मूल्य पर सेट करता है। यह धागा सुरक्षित है और मुझे किसी लॉकिंग कोड को लिखने की ज़रूरत नहीं है, जब तक कि मुझे कुछ याद न हो। मेरे लिए बहुत उपयोगी लगता है। - bugloaf
@HotLicks एक और मजेदार एक; कुछ आर्किटेक्चर (किसी को याद नहीं किया जा सकता है) पर, 64 बिट मान एक तर्क के रूप में पारित हो सकते हैं, एक रजिस्टर में आधा और ढेर पर आधा पारित किया जा सकता है। atomic क्रॉस-थ्रेड अर्ध-मूल्य पढ़ता है। (यह ट्रैक करने के लिए एक मजेदार बग था।) - bbum
@congliu थ्रेड ए बिना ऑब्जेक्ट देता है retain/autorelease नृत्य। थ्रेड बी ऑब्जेक्ट जारी करता है। थ्रेड ए चला जाता है उछाल। atomic यह सुनिश्चित करता है कि रिटर्न वैल्यू के लिए थ्रेड ए में एक मजबूत संदर्भ (एक +1 बनाए रखें) है। - bbum


यह ऐप्पल में समझाया गया है प्रलेखन, लेकिन वास्तव में कुछ उदाहरण हैं जो वास्तव में हो रहा है। ध्यान दें कि कोई "परमाणु" कीवर्ड नहीं है, यदि आप "nonatomic" निर्दिष्ट नहीं करते हैं तो संपत्ति परमाणु है, लेकिन स्पष्ट रूप से "परमाणु" निर्दिष्ट करने से एक त्रुटि होगी।

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

अब, परमाणु संस्करण थोड़ा और जटिल है:

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

असल में, थॉमस सुरक्षा की गारंटी के लिए परमाणु संस्करण को लॉक लेना पड़ता है, और ऑब्जेक्ट पर रेफ गिनती भी बंप कर रहा है (और ऑटोरेलीज इसे संतुलित करने के लिए गिनती है) ताकि ऑब्जेक्ट को कॉलर के लिए मौजूद होने की गारंटी दी जा सके, अन्यथा वहां एक संभावित रेस स्थिति है यदि कोई अन्य धागा मूल्य निर्धारित कर रहा है, जिससे रेफ गिनती 0 तक गिर जाती है।

वास्तव में विभिन्न प्रकार के विभिन्न प्रकार हैं कि ये चीजें इस बात पर निर्भर करती हैं कि गुण स्केलर मान या ऑब्जेक्ट्स हैं, और कैसे बनाए रखते हैं, प्रतिलिपि बनाते हैं, पढ़ाते हैं, nonatomic, आदि बातचीत करते हैं। आम तौर पर संपत्ति सिंथेसाइज़र सिर्फ सभी संयोजनों के लिए "सही चीज़" को कैसे जानते हैं।


342
2018-02-26 06:24



ऐसा नहीं है कि लॉक "थ्रेड सुरक्षा की गारंटी नहीं देता"। - Jonathan Sterling
@ लुइस Gerbarg: मेरा मानना ​​है कि (nonatomic, retain) setter का आपका संस्करण ठीक से काम नहीं करेगा यदि आप एक ही ऑब्जेक्ट असाइन करने का प्रयास करते हैं (यानी: userName == userName_) - Florin
आपका कोड थोड़ा भ्रामक है; वहाँ है नहीं गारंटी है कि परमाणु गेटर्स / सेटर्स सिंक्रनाइज़ किए गए हैं। गंभीर,@property (assign) id delegate; किसी भी चीज़ पर सिंक्रनाइज़ नहीं किया गया है (आईओएस एसडीके जीसीसी 4.2 एआरएम -Os), जिसका मतलब है कि बीच दौड़ है [self.delegate delegateMethod:self]; तथा foo.delegate = nil; self.foo = nil; [super dealloc];। देख stackoverflow.com/questions/917884/... - tc.
@fyolnish मुझे यकीन नहीं है कि क्या _val/val हैं, लेकिन नहीं, वास्तव में नहीं। एक परमाणु के लिए गेटटर copy/retain संपत्ति को यह सुनिश्चित करने की ज़रूरत है कि यह किसी ऑब्जेक्ट को वापस नहीं लौटाता है जिसका रिफाउंट शून्य हो जाता है क्योंकि सेटर को किसी अन्य धागे में बुलाया जाता है, जिसका अनिवार्य रूप से इसका मतलब है कि इसे इवर को पढ़ने की जरूरत है, यह सुनिश्चित करते हुए इसे बनाए रखें कि सेटटर ने ओवरराइट नहीं किया है और इसे रिलीज़ नहीं किया है , और फिर बनाए रखने के लिए इसे स्वत: बदलें। इसका अनिवार्य रूप से मतलब है दोनों गेटर और सेटर को लॉक का उपयोग करना पड़ता है (यदि मेमोरी लेआउट तय किया गया था तो इसे सीएएस 2 निर्देशों के साथ किया जाना चाहिए; -retain एक विधि कॉल है)। - tc.
@ टीसी यह काफी समय से रहा है लेकिन मुझे जो लिखना है वह शायद यह था: gist.github.com/fjolnir/5d96b3272c6255f6baae लेकिन हां सेटफू से पहले पाठक द्वारा पुराने मूल्य को पढ़ना संभव है: रिटर्न, और पाठक इसे वापस करने से पहले जारी किया जाता है। लेकिन हो सकता है कि अगर सेटटर का इस्तेमाल किया जाए - इसके बदले में - कृपया इसे ठीक कर देगा। - Fjölnir


परमाणु

  • डिफ़ॉल्ट व्यवहार है
  • यह सुनिश्चित करेगा कि वर्तमान प्रक्रिया सीपीयू द्वारा पूरी की जाती है, इससे पहले कि एक और प्रक्रिया वैरिएबल तक पहुंच जाए
  • तेजी से नहीं है, क्योंकि यह सुनिश्चित करता है कि प्रक्रिया पूरी तरह से पूरी हो गई है

गैर-परमाणु

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

148
2018-05-25 10:56





अंतर को समझने का सबसे अच्छा तरीका निम्नलिखित उदाहरण का उपयोग कर रहा है।

मान लीजिए कि "नाम" नामक एक परमाणु स्ट्रिंग प्रॉपर्टी है, और यदि आप कॉल करते हैं [self setName:@"A"] थ्रेड ए से, कॉल करें [self setName:@"B"] थ्रेड बी से, और कॉल करें [self name] थ्रेड सी से, फिर विभिन्न धागे पर सभी संचालन क्रमशः किया जाएगा जिसका अर्थ है कि अगर एक थ्रेड एक सेटर या गेटर निष्पादित कर रहा है, तो अन्य धागे इंतजार करेंगे।

यह संपत्ति "नाम" को सुरक्षित / लिखता है, लेकिन अगर कोई अन्य थ्रेड, डी, कॉल करता है [name release] इसके साथ ही यह ऑपरेशन एक क्रैश उत्पन्न कर सकता है क्योंकि यहां कोई सेटटर / गेटर कॉल शामिल नहीं है। जिसका अर्थ है कि ऑब्जेक्ट को सुरक्षित / लिखना सुरक्षित (एटीओएमआईसी) है, लेकिन थ्रेड-सुरक्षित नहीं है क्योंकि एक और धागे ऑब्जेक्ट को किसी भी प्रकार के संदेश भेज सकते हैं। डेवलपर को ऐसी वस्तुओं के लिए थ्रेड-सुरक्षा सुनिश्चित करना चाहिए।

यदि संपत्ति "नाम" nonatomic था, तो उपरोक्त उदाहरण में सभी धागे - ए, बी, सी और डी एक साथ अप्रत्याशित परिणाम उत्पादन एक साथ निष्पादित करेगा। परमाणु के मामले में, ए, बी या सी में से कोई भी पहले निष्पादित करेगा, लेकिन डी अभी भी समानांतर में निष्पादित हो सकता है।


125
2018-01-31 18:36





वाक्यविन्यास और अर्थशास्त्र पहले से ही इस प्रश्न के अन्य उत्कृष्ट उत्तरों से अच्छी तरह से परिभाषित हैं। इसलिये क्रियान्वयन तथा प्रदर्शन अच्छी तरह से विस्तृत नहीं हैं, मैं अपना जवाब जोड़ूंगा।

इन 3 के बीच कार्यात्मक अंतर क्या है?

मैं हमेशा परमाणु को एक डिफ़ॉल्ट रूप से काफी उत्सुक माना जाता था। अमूर्त स्तर पर हम 100% थ्रेड-सुरक्षा प्राप्त करने के लिए वाहन के रूप में कक्षा के लिए परमाणु गुणों का उपयोग करते हुए काम करते हैं। वास्तव में सही बहुप्रचारित कार्यक्रमों के लिए, प्रोग्रामर द्वारा हस्तक्षेप लगभग निश्चित रूप से एक आवश्यकता है। इस बीच, प्रदर्शन विशेषताओं और निष्पादन को अभी तक गहराई में विस्तृत नहीं किया गया है। वर्षों से कुछ भारी बहुप्रचारित कार्यक्रमों को लिखने के बाद, मैं अपनी संपत्तियों को घोषित कर रहा था nonatomicपूरे समय क्योंकि किसी भी उद्देश्य के लिए परमाणु समझदार नहीं था। परमाणु और nonatomic गुणों के विवरण के बारे में चर्चा के दौरान यह प्रश्न, मैंने कुछ प्रोफाइलिंग कुछ उत्सुक परिणामों का सामना किया।

क्रियान्वयन

ठीक। पहली बात यह है कि मैं साफ़ करना चाहता हूं कि लॉकिंग कार्यान्वयन कार्यान्वयन-परिभाषित और सारणित है। लुई का उपयोग करता है @synchronized(self) अपने उदाहरण में - मैंने इसे भ्रम के एक आम स्रोत के रूप में देखा है। कार्यान्वयन नहीं करता है वास्तव में उपयोग @synchronized(self); यह वस्तु स्तर का उपयोग करता है स्पिन ताले। लुई का चित्रण संरचनाओं का उपयोग करके उच्च स्तरीय चित्रण के लिए अच्छा है, हम सभी परिचित हैं, लेकिन यह जानना महत्वपूर्ण है कि इसका उपयोग नहीं किया जाता है @synchronized(self)

एक और अंतर यह है कि परमाणु गुण गेटटर के भीतर आपकी वस्तुओं को चक्र बनाए रखेंगे / रिलीज़ करेंगे।

प्रदर्शन

यहां दिलचस्प हिस्सा है: परमाणु संपत्ति का उपयोग करके प्रदर्शन में प्रवेश करता है निर्विरोध (उदाहरण के लिए सिंगल-थ्रेडेड) कुछ मामलों में वास्तव में बहुत तेज हो सकते हैं। आदर्श मामलों से कम में, परमाणु पहुंच के उपयोग के ओवरहेड से 20 गुना अधिक खर्च हो सकता है nonatomic। जबकि चुनाव लड़ा तीन धागे संरचना (2.2 गीगाहर्ट्ज) के लिए 7 धागे का उपयोग करने के मामले में 44 गुना धीमा था कोर i7 क्वाड कोर, x86_64)। तीन-बाइट संरचना एक बहुत धीमी संपत्ति का एक उदाहरण है।

दिलचस्प पक्ष नोट: तीन-बाइट संरचना के उपयोगकर्ता परिभाषित एक्सेसर्स संश्लेषित परमाणु एक्सेसर्स की तुलना में 52 गुना तेज थे; या सिंथेसाइज्ड nonatomic accessors की 84% गति।

चुनाव के मामलों में वस्तुओं 50 गुना से भी अधिक हो सकता है।

कार्यान्वयन में अनुकूलन और विविधताओं की संख्या के कारण, इन संदर्भों में वास्तविक दुनिया के प्रभावों को मापना काफी मुश्किल है। आप अक्सर ऐसा कुछ सुन सकते हैं जैसे "इसे भरोसा करें, जब तक आप प्रोफाइल न करें और पाते हैं कि यह एक समस्या है"। अमूर्त स्तर के कारण, वास्तविक प्रभाव को मापना वास्तव में काफी मुश्किल है। प्रोफ़ाइल से वास्तविक लागतों को प्राप्त करना बहुत समय ले सकता है, और अबाध के कारण, काफी गलत है। साथ ही, एआरसी बनाम एमआरसी एक बड़ा अंतर कर सकता है।

तो चलो वापस कदम, नहीं संपत्ति के उपयोग के कार्यान्वयन पर ध्यान केंद्रित करते हुए, हम सामान्य संदिग्धों को शामिल करेंगे objc_msgSend, और कई कॉल के लिए कुछ वास्तविक दुनिया के उच्च स्तरीय परिणामों की जांच करें NSString गेटटर इन निर्विरोध मामलों (सेकंड में मूल्य):

  • एमआरसी | nonatomic | मैन्युअल रूप से कार्यान्वित गेटर्स: 2
  • एमआरसी | nonatomic | संश्लेषित गेटर: 7
  • एमआरसी | परमाणु | संश्लेषित गेटर: 47
  • एआरसी | nonatomic | संश्लेषित गेटर: 38 (नोट: एआरसी की रेफ गिनती साइक्लिंग यहां)
  • एआरसी | परमाणु | संश्लेषित गेटर: 47

जैसा कि आपने शायद अनुमान लगाया है, संदर्भ गणना गतिविधि / साइकलिंग परमाणुओं और एआरसी के तहत एक महत्वपूर्ण योगदानकर्ता है। आप चुनाव मामलों में भी अधिक अंतर देखेंगे।

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


108
2017-08-18 09:47



एमआरसी | परमाणु | संश्लेषित गेटर: 47 एआरसी | परमाणु | संश्लेषित गेटर: 47 क्या उन्हें समान बनाता है? एआरसी ज्यादा ओवरहेड नहीं होना चाहिए? - SDEZero
तो अगर परमाणु गुण खराब हैं तो वे डिफ़ॉल्ट हैं। बॉयलरप्लेट कोड बढ़ाने के लिए? - Kunal Balani
@ LearnCocos2D मैंने एक ही मशीन पर 10.8.5 पर परीक्षण किया, 10.8 को लक्षित किया, एकल थ्रेडेड अनचाहे केस के साथ NSString जो अमर नहीं है: -ARC atomic (BASELINE): 100% -ARC nonatomic, synthesised: 94% -ARC nonatomic, user defined: 86% -MRC nonatomic, user defined: 5% -MRC nonatomic, synthesised: 19% -MRC atomic: 102% - परिणाम आज थोड़ा अलग हैं। मैं कोई नहीं कर रहा था @synchronizedतुलना। @synchronized अर्थात् अलग है, और यदि आपके पास अनौपचारिक समवर्ती कार्यक्रम हैं तो मैं इसे एक अच्छा टूल नहीं मानता हूं। अगर आपको गति की जरूरत है, तो बचें @synchronized। - justin
क्या आपके पास यह परीक्षा कहीं ऑनलाइन है? मैं यहां अपना जोड़ता रहता हूं: github.com/LearnCocos2D/LearnCocos2D/tree/master/... - LearnCocos2D
@ LearnCocos2D मैंने उन्हें मानव उपभोग के लिए तैयार नहीं किया है, क्षमा करें। - justin


परमाणु= धागा सुरक्षा

गैर-परमाणु = कोई धागा सुरक्षा नहीं

थ्रेड सुरक्षा:

इंस्टेंस वैरिएबल थ्रेड-सुरक्षित होते हैं यदि वे एकाधिक थ्रेड से एक्सेस करते समय सही तरीके से व्यवहार करते हैं, शेड्यूलिंग या रनटाइम पर्यावरण द्वारा उन थ्रेडों के निष्पादन की अंतःक्रिया के बावजूद, और कॉलिंग कोड के हिस्से पर कोई अतिरिक्त सिंक्रनाइज़ेशन या अन्य समन्वय के बिना।

हमारे संदर्भ में:

यदि कोई थ्रेड आवृत्ति के मान को बदलता है तो बदले गए मान सभी धागे के लिए उपलब्ध होते हैं, और केवल एक थ्रेड एक समय में मान बदल सकता है।

कहां उपयोग करें atomic:

यदि आवृत्ति परिवर्तनीय को बहुप्रचारित वातावरण में पहुंचाया जा रहा है।

का प्रभाव atomic:

जितना तेज़ नहीं nonatomic इसलिये nonatomic रनटाइम से उस पर किसी भी निगरानी कार्य की आवश्यकता नहीं है।

कहां उपयोग करें nonatomic:

यदि आवृत्ति चर को कई धागे से बदला नहीं जा रहा है तो आप इसका उपयोग कर सकते हैं। यह प्रदर्शन में सुधार करता है।


89
2017-07-10 13:07



जो कुछ भी आप यहां कहते हैं वह सही है, लेकिन आखिरी वाक्य अनिवार्य रूप से "गलत" है, दुरा, आज के प्रोग्रामिंग के लिए। यह वास्तव में अकल्पनीय है कि आप इस तरह "प्रदर्शन में सुधार" करने की कोशिश करने के लिए परेशान होंगे। (मेरा मतलब है कि, इससे पहले कि आप प्रकाश के भीतर आ जाएंगे, आप "एआरसी का उपयोग नहीं कर रहे", "एनएसएसटींग का उपयोग नहीं कर रहे हैं क्योंकि यह धीमा है!" और इसी तरह।) एक चरम उदाहरण बनाने के लिए, यह "टीम, कोड में कोई टिप्पणी न करें, क्योंकि यह हमें धीमा कर देता है। " कोई यथार्थवादी विकास पाइपलाइन नहीं है जहां आप अविश्वसनीयता के लिए (nonexistent) सैद्धांतिक प्रदर्शन लाभ चाहते हैं। - Fattie
@ जोबलो यह एक तथ्य है कि आप इसे यहां सत्यापित कर सकते हैं developer.apple.com/library/mac/documentation/Cocoa/Conceptual/... - Durai Amuthan.H
अच्छी तरह से समझाया (वाई) - Sunil Targe


मुझे परमाणु और गैर-परमाणु गुणों का एक सुंदर अच्छी तरह से स्पष्टीकरण मिला यहाँ। यहां से कुछ प्रासंगिक पाठ यहां दिए गए हैं:

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

तो मैं अनुमान लगा रहा हूं कि इस मामले में परमाणु का मतलब है कि विशेषता पाठक विधियों को बाधित नहीं किया जा सकता है - असल में इसका अर्थ यह है कि विधि द्वारा पढ़े जाने वाले चर (ओं) को उनके मूल्य को आधे रास्ते में नहीं बदला जा सकता क्योंकि कुछ अन्य थ्रेड / कॉल / फ़ंक्शन हो जाता है सीपीयू पर swapped।

क्यों कि atomic चर को बाधित नहीं किया जा सकता है, किसी भी बिंदु पर उनके द्वारा निहित मूल्य (थ्रेड-लॉक) होने की गारंटी है uncorruptedहालांकि, यह थ्रेड लॉक सुनिश्चित करने से उन्हें धीमा कर दिया जाता है। non-atomic दूसरी ओर चर, ऐसी कोई गारंटी नहीं देते हैं लेकिन त्वरित पहुंच की लक्जरी पेशकश करते हैं। इसे समेटने के लिए, साथ जाएं non-atomic जब आप जानते हैं कि आपके चर को एक साथ कई धागे तक पहुंचाया जाएगा और चीजों को गति मिलेगी।


67
2018-02-24 05:17





इतने सारे लेख पढ़ने के बाद, चरम संपत्ति विशेषताओं की जांच करने के लिए ओवरफ़्लो पोस्ट स्टैक ओवर और डेमो एप्लिकेशन बनाने के बाद, मैंने सभी विशेषताओं को एक साथ जानकारी देने का निर्णय लिया:

  1. atomic             // चूक
  2. nonatomic
  3. strong = retain        // चूक
  4. weak = unsafe_unretained
  5. retain
  6. assign             // चूक
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite                 // चूक

लेख में आईओएस में परिवर्तनीय संपत्ति विशेषताओं या संशोधक आप उपर्युक्त सभी विशेषताओं को पा सकते हैं, और यह निश्चित रूप से आपकी सहायता करेगा।

  1. atomic

    • atomic का मतलब है केवल एक धागा चर (स्थिर प्रकार) का उपयोग करें।
    • atomic धागा सुरक्षित है।
    • लेकिन यह प्रदर्शन में धीमा है
    • atomic डिफ़ॉल्ट व्यवहार है
    • एक गैर कचरा एकत्रित वातावरण में परमाणु अभिगम (यानी बनाए रखने / रिलीज / ऑटोरेलीज का उपयोग करते समय) एक लॉक का उपयोग यह सुनिश्चित करने के लिए करेगा कि कोई अन्य थ्रेड सही सेटिंग / मूल्य प्राप्त करने में हस्तक्षेप नहीं करता है।
    • यह वास्तव में एक कीवर्ड नहीं है।
       

    उदाहरण:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

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

    उदाहरण:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    

61
2018-03-21 07:10



असाइन और मजबूत / दोनों को डिफ़ॉल्ट कैसे बनाए रख सकते हैं? - BangOperator
एआरसी के साथ मजबूत आता है, एआरसी से पहले डिफ़ॉल्ट बनाए रखा था - abdullahselek


सबसे आसान जवाब पहले: आपके दूसरे दो उदाहरणों के बीच कोई अंतर नहीं है। डिफ़ॉल्ट रूप से, संपत्ति एक्सेसर्स परमाणु हैं।

एक गैर कचरा एकत्रित वातावरण में परमाणु अभिगम (यानी बनाए रखने / रिलीज / ऑटोरेलीज का उपयोग करते समय) एक लॉक का उपयोग यह सुनिश्चित करने के लिए करेगा कि कोई अन्य थ्रेड सही सेटिंग / मूल्य प्राप्त करने में हस्तक्षेप नहीं करता है।

देखें "प्रदर्शन और थ्रेडिंग"कुछ और जानकारी के लिए ऐप्पल के उद्देश्य-सी 2.0 दस्तावेज़ीकरण के अनुभाग और बहु-थ्रेडेड ऐप्स बनाते समय अन्य विचारों के लिए।


52
2018-02-26 02:56



दो कारण। सबसे पहले, संश्लेषित कोड के लिए यह तेज़ उत्पन्न करता है (लेकिन थ्रेडसेफ कोड नहीं)। दूसरा, यदि आप ग्राहक एक्सेसर्स लिख रहे हैं जो परमाणु नहीं हैं, तो यह आपको किसी भी भविष्य के उपयोगकर्ता के लिए एनोटेट करने देता है कि जब कोड कार्यान्वित किए बिना कोड इंटरफ़ेस पढ़ रहे हों तो कोड परमाणु नहीं है। - Louis Gerbarg
@ डोगवेदर: देखें कोको के आईबीओलेट गुण डिफ़ॉल्ट रूप से परमाणु क्यों हैं, और कोको टच नहीं हैं? - Anoop Vaidya


परमाणु:

परमाणु गारंटी है कि संपत्ति तक पहुंच एक परमाणु तरीके से किया जाएगा। जैसे यह हमेशा पूरी तरह से प्रारंभिक ऑब्जेक्ट्स लौटाता है, किसी थ्रेड पर किसी प्रॉपर्टी के किसी भी प्राप्त / सेट को पूरा करने से पहले इसे पूरा करना होगा।

यदि आप एक बार में दो धागे पर होने वाले निम्न कार्य की कल्पना करते हैं तो आप देख सकते हैं कि परिणाम सुंदर क्यों नहीं होंगे।

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

पेशेवर: बहु-थ्रेडिंग के मामले में हर बार पूरी तरह से प्रारंभिक वस्तुओं की वापसी इसे सर्वोत्तम विकल्प बनाती है।

विपक्ष: प्रदर्शन हिट, थोड़ा धीमा निष्पादन बनाता है

गैर परमाणु:

परमाणु के विपरीत, यह हर बार पूरी तरह से प्रारंभिक वस्तु वापसी सुनिश्चित नहीं करता है।

पेशेवर: बेहद तेजी से निष्पादन।

विपक्ष: बहु थ्रेडिंग के मामले में कचरा मूल्य की संभावनाएं।


52
2018-02-26 02:41



वह टिप्पणी बहुत समझ में नहीं आता है। क्या आप स्पष्ट कर सकते हो? यदि आप ऐप्पल साइट पर उदाहरण देखते हैं तो परमाणु कीवर्ड अपनी गुणों को अपडेट करते समय ऑब्जेक्ट पर सिंक्रनाइज़ करता है। - Andrew Grant
यह जवाब किसी भी अन्य जवाब के लिए मुझे और अधिक समझ में आता है! स्पष्टीकरण के लिए धन्यवाद। - dreamBegin