संपत्ति "गैर-परमाणु" का क्या अर्थ है?


144

इस कोड में "गैर-परमाणु" का क्या अर्थ है?

@property(nonatomic, retain) UITextField *theUsersName;

परमाणु और गैर-परमाणु के बीच क्या अंतर है?

धन्यवाद


3
क्षमा करें, यह निर्दिष्ट करना भूल गया है कि उद्देश्य-सी (कोको)

कृपया इस लिंक को भी पढ़ें - stackoverflow.com/questions/588866/…
विजेंद्र

इसे पढ़ने वाले किसी भी व्यक्ति के लिए, 2014 के लिए यह जानना बहुत ज़रूरी है कि यह जानकारी बहुत पुरानी है। एक शब्द में, किसी भी कारण से कभी भी गैर-परमाणु का उपयोग करने का कोई कारण नहीं है और यह अनिवार्य रूप से गलत है। यह प्राचीन इतिहास है। गैर-परमाणु का अर्थ है "थ्रेड असुरक्षित मोड" और (एक शब्द में) अब पूरी तरह से अप्रासंगिक है। कुछ टिप्पणियाँ यहाँ stackoverflow.com/q/23977765/294884
फटी

मैं "गैर प्रासंगिक" बयान से असहमत हूं। यदि मान दुर्लभ रूप से बदलता है और Apple डॉक में उदाहरण अंतिम नाम है। यह एक बार तब बदल जाता है जब परमाणु संकेत का उपयोग करना संसाधनों की बर्बादी होती है क्योंकि चेक की आवश्यकता नहीं होती है।
निक टर्नर

जवाबों:


268

Apple डॉक्स पर एक नज़र डालें ।

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

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

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


7
मुझे यह उत्तर पसंद है - कम भ्रामक, सरल और अधिक पूर्ण जो उन लोगों को कहीं और मिले!
पापिल्लोनुकु

वास्तव में महान एक और कम भ्रामक (+1) लेकिन क्या आप यह बता सकते हैं कि परमाणु अणु परमाणु की तुलना में बहुत अधिक तेजी से क्यों तेजी से बढ़ते हैं?
काश

2
@ गैर-परमाणु अभिगमकर्ता तेज हो सकते हैं क्योंकि अन्य थ्रेड्स को पढ़ने / लिखने से रोकने के लिए, आपको एक म्यूटेक्स पकड़ना होगा या कुछ अन्य निम्न-स्तरीय ट्रिक्स करने होंगे जिनकी लागत सीपीयू समय है। यदि आप लॉक का उपयोग कर रहे हैं, तो आप अन्य थ्रेड्स पर ब्लॉक करना भी बंद कर सकते हैं, जिसमें समय भी लगता है।
जेसी रसाक

1
@ रोब आप इसके बारे में एक नया सवाल पूछना चाहते हैं।
जेसी रसाक

1
@Pratik क्षमा करें, यह सही नहीं है। जो उद्धरण आप दिखाते हैं वह ठीक वही बात कह रहा है जो मैंने किया था: कि संपत्ति बनाने atomicसे व्यक्तिगत संपत्तियों तक पहुँचने के दौरान दुर्घटनाओं से बचा जाता है, लेकिन यह सुनिश्चित नहीं करता है कि वस्तु एक पूरे के रूप में (यानी पहले और अंतिम नामों की तरह अलग-अलग गुणों तक पहुँच) करने जा रही है। उचित वस्तु।
जेसी रस्क

46

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

  1. परमाणु // डिफ़ॉल्ट
  2. nonatomic
  3. मजबूत = बनाए रखने / डिफ़ॉल्ट
  4. कमजोर = असुरक्षित_सुना
  5. बनाए रखने के
  6. // डिफ़ॉल्ट असाइन करें
  7. unsafe_unretained
  8. प्रतिलिपि
  9. सिफ़ पढ़िये
  10. readwrite // डिफ़ॉल्ट

इतना नीचे विस्तृत लेख लिंक है जहाँ आप उपरोक्त सभी विशेषताओं को पा सकते हैं, जो निश्चित रूप से आपकी मदद करेंगे। उन सभी लोगों को बहुत धन्यवाद, जो यहाँ सबसे अच्छा जवाब देते हैं !!

आईओएस में परिवर्तनीय संपत्ति विशेषताएँ या संशोधक

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

उदाहरण :

@property (retain) NSString *name;

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

उदाहरण:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

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


9

बहु-थ्रेडेड प्रोग्राम में, एक परमाणु ऑपरेशन को आंशिक रूप से बाधित नहीं किया जा सकता है, जबकि गैर-परमाणु संचालन कर सकते हैं।

इसलिए, यदि आपके पास एक महत्वपूर्ण संचालन है जो कि गैर-परमाणु है जिसे आप बाधित नहीं करना चाहते हैं तो आपको म्यूटेक्स (या ऐसा कुछ) का उपयोग करना चाहिए।


8

यदि आप "परमाणु" निर्दिष्ट करते हैं, तो जनरेट किए गए एक्सेस फ़ंक्शंस में कुछ अतिरिक्त कोड होते हैं जो एक साथ अपडेट होने से बचते हैं।


6

आमतौर पर परमाणु का अर्थ है कि संपत्ति को लिखना / पढ़ना एक ही ऑपरेशन के रूप में होता है। Atomic_operation


2

आप नीचे दिए गए लेख को पढ़कर इस सामान को संभालने में सक्षम हो सकते हैं।

थ्रेडिंग की व्याख्या गैर-परमाणु उद्देश्य से की गई

गैर-परमाणु - थ्रेड सुरक्षित नहीं है

परमाणु - थ्रेड सेफ - यह डिफ़ॉल्ट गुण विशेषता है।


1
क्या आप सुनिश्चित हैं कि यह विपरीत नहीं है? परमाणु गुण हैं सुरक्षित लेकिन nonatomic गुण हैं नहीं सुरक्षित। पिछली बार मैंने इसे इस तरह से चेक किया था: P
डेविड रोनकविस्ट

0

"परमाणु" का मतलब है कि संपत्ति के लिए उपयोग धागा सुरक्षित है। जबकि "nonatomic" यह के विपरीत है। जब आप ऑब्जेक्टिव-सी में एक संपत्ति संपत्ति डिफ़ॉल्ट रूप से परमाणु रहे हैं, ताकि संश्लेषित accessors संपत्ति को मजबूत पहुँच प्रदान करते हैं की घोषणा एक मल्टीथ्रेडेड वातावरण में - यानी, गेट्टर से लौटाया गया मान या सेट्टर के माध्यम से सेट किया गया हमेशा पूर्ण पुनर्प्राप्त किया जाता है या इस बात की परवाह किए बिना कि अन्य सूत्र समवर्ती रूप से क्या निष्पादित कर रहे हैं। लेकिन यदि आप संपत्ति को गैर-परमाणु के रूप में घोषित करते हैं।

@property (nonatomic, retain)  NSString *myString;

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


-2

एक बहु धागे के लिए है। एक नहीं है


IMHO: किसी भी उत्थान को प्राप्त करने के लिए, आपको अधिक विशिष्ट होने और अपना उत्तर लिखने में कुछ समय बिताने की आवश्यकता है।
जोहान कार्ल्ससन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.