उद्देश्य-सी में मजबूत और कमजोर के बीच अंतर


308

मैं ओब्ज-सी के लिए नया हूं, इसलिए मेरा पहला सवाल है:

क्या अंतर हैं strongऔर weakमें @propertyवस्तुओं के लिए संकेत की घोषणाओं?

इसके अलावा, क्या nonatomicमतलब है?


19
वास्तव में यह एक अच्छा सवाल है, कभी-कभी, हम यह भूल गए कि कैसे मजबूत / कमजोर और परमाणु / गैर-परमाणु प्राथमिकताओं की मूल अवधारणा .... :) हमें इसके बारे में याद दिलाने के लिए धन्यवाद ...
औरइकोरिया

10
@JackyBoy व्हाट्सएप मजेदार यह है कि Google पर प्रस्तावित सरल खोज मुझे यहां योग्य बनाती है। # सर्कुलरफ्रेंस
जेसन रेनाल्डो

10
मैं Google पर कई उत्तरों पर भरोसा नहीं करता, लेकिन हमेशा बुद्धिमान उत्तर के लिए SO को संदर्भित करता
हूं

जवाबों:


641

एक मजबूत संदर्भ (जिसका उपयोग आप ज्यादातर मामलों में करेंगे) का मतलब है कि आप इस संपत्ति / चर के साथ जिस वस्तु को संदर्भित कर रहे हैं उसे "खुद" करना चाहते हैं। कंपाइलर इस बात का ध्यान रखेगा कि आप जिस भी वस्तु को इस संपत्ति को सौंपेंगे, वह तब तक नष्ट नहीं होगी, जब तक आप इसे एक मजबूत संदर्भ के साथ इंगित नहीं करते। केवल एक बार जब आप संपत्ति को nilनष्ट करने के लिए संपत्ति निर्धारित करते हैं (जब तक कि एक या अधिक अन्य वस्तुएं भी इसका एक मजबूत संदर्भ नहीं रखती हैं)।

इसके विपरीत, एक कमजोर संदर्भ के साथ आप संकेत करते हैं कि आप ऑब्जेक्ट के जीवनकाल पर नियंत्रण नहीं रखना चाहते हैं। जिस ऑब्जेक्ट को आप कमजोर रूप से संदर्भित कर रहे हैं, वह केवल उसी पर रहता है क्योंकि कम से कम एक अन्य वस्तु उसके लिए एक मजबूत संदर्भ रखती है। एक बार जब ऐसा नहीं होता है, तो वस्तु नष्ट हो जाती है और आपकी कमजोर संपत्ति स्वचालित रूप से सेट हो जाएगी nil। IOS में कमजोर संदर्भों के सबसे अधिक उपयोग मामले हैं:

  1. प्रतिनिधि गुण, जिन्हें अक्सर चक्र बनाए रखने से बचने के लिए कमजोर रूप से संदर्भित किया जाता है, और

  2. किसी कंट्रोलर के मुख्य दृश्य के साक्षात्कार / नियंत्रण क्योंकि वे दृश्य पहले से ही मुख्य दृश्य द्वारा दृढ़ता से आयोजित किए जाते हैं।

एटॉमिक बनाम नॉनटॉमिक, गेटर और सेटर विधियों की थ्रेड सुरक्षा को संदर्भित करता है जो कंपाइलर संपत्ति के लिए संश्लेषित करता है। परमाणु (डिफ़ॉल्ट) कंपाइलर को एक्सेसर के तरीकों को थ्रेड-सेफ बनाने के लिए कहता है (एक आइवर एक्सेस होने से पहले एक लॉक जोड़कर) और गैर-परमाणु इसके विपरीत करता है। गैर-परमाणु का लाभ थोड़ा अधिक है। IOS पर, Apple लगभग सभी संपत्तियों के लिए गैर-परमाणु का उपयोग करता है इसलिए सामान्य सलाह यही है कि आप भी ऐसा ही करें।


28
@ बॉर्न: यह इस बात पर निर्भर करता है कि थ्रेड सेफ्टी से आपका क्या मतलब है। atomicगारंटी देता है कि संपत्ति को एक ही समय में कई थ्रेड्स से सुरक्षित रूप से पढ़ा और लिखा जा सकता है। इसका मतलब ऐसी वस्तु से नहीं है जिसके गुण सभी atomicस्वचालित रूप से थ्रेड-सुरक्षित हैं।
ओले बेगमैन

3
महान विवरण। मुझे लगता है कि मैं वास्तव में अब तक नहीं मिला। धन्यवाद।
अह्मदेल्फ़्फ़

1
सेब प्रलेखन के अनुसार, परमाणु और गैर-परमाणु को धागा सुरक्षा का पर्याय होना चाहिए। डेवलपर
.apple.com/library

5
"नोट: संपत्ति की परमाणुता किसी वस्तु की धागा सुरक्षा का पर्याय नहीं है।" developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS

जब हम नहीं चाहते तो हम केवल उदाहरण क्यों नहीं हटाते? जब हम नहीं चाहते हैं तो हम केवल गुब्बारे से हवा को क्यों नहीं निकाल सकते हैं या इसे नष्ट नहीं कर सकते हैं, हमें संलग्न तारों की परवाह क्यों करनी चाहिए? हमें सिर्फ डेटा चाहिए।
आशीष पाइसे

706

गुब्बारे के संदर्भ में मजबूत और कमजोर संदर्भों के बारे में सोचना मददगार हो सकता है।

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

एक मजबूत संदर्भ उस गुब्बारे को एक स्ट्रिंग पर रखने जैसा है। जब तक आप गुब्बारे से जुड़ी एक स्ट्रिंग को पकड़ रहे हैं, यह दूर नहीं उड़ जाएगा।

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


68
+2 (यदि केवल मैं कर सकता था)। सच में, रचनात्मक व्याख्या!
कॉन एंटोनकोस

25
आईओएस के विकास की 1 डेढ़ साल के बाद, मुझे लगता है अब मैं स्पष्ट रूप से क्या समझा strongऔर weakवास्तव में मतलब।
ईसरू

17
@ X.Li रिटेन चक्र ऐसा है जैसे आपके पास बैलून के 2 तार हैं, उनमें से एक आपके स्वामित्व में है (इसलिए आप इस बैलोन के मालिक हैं), दूसरा बैलोन के स्वामित्व में है (इसलिए यह बैलोन आपके पास है)। चूँकि आपके पास केवल आपके स्ट्रिंग तक पहुंच है, तो यदि आप बैलून नहीं जाना चाहते हैं तो आप बैलन को कैसे जाने देंगे? तो यह बेहतर है कि आप बैलोन (मजबूत) के मालिक हैं जबकि बैलोन आपके (कमजोर) नहीं है। जब आप इसे जाने देना चाहते हैं, तो बस तार काट दें :)
snakeninny

5
उसकी प्रोफ़ाइल पढ़ें, वह एक आईओएस प्रशिक्षक है। बहुत रचनात्मक व्याख्या !! हैट्स ऑफ :)
हेमांग

3
परमाणु बनाम गैर-परमाणु मुझे लगता है कि केंद्र में एक शौचालय के साथ, कई दरवाजों के साथ एक सार्वजनिक शौचालय कक्ष के रूप में वर्णित किया जा सकता है। एक बार जब कोई व्यक्ति एक दरवाजे के माध्यम से शौचालय में जाता है, तो वह शौचालय के अन्य सभी दरवाजों को बंद कर सकता है यदि वह अजीबता के क्षण का अनुभव नहीं करना चाहता है। जबरदस्त हंसी। इस बकवास उपमा को पढ़ने के लिए धन्यवाद।
चेन ली योंग

24

मजबूत : इसके लिए आने वाले मूल्य प्रदान करता है, यह आने वाले मूल्य को बनाए रखेगा और उदाहरण चर के मौजूदा मूल्य को जारी करेगा

कमजोर : इसे बनाए रखने के बिना इसे आने वाले मूल्य प्रदान करेगा।

तो मूल अंतर नए चर को बनाए रखने का है। सामान्य तौर पर आप इसे बनाए रखना चाहते हैं, लेकिन ऐसी परिस्थितियां हैं, जहां आप इसे नहीं चाहते हैं अन्यथा आप एक चक्र बनाए रखेंगे और वस्तुओं को स्मृति मुक्त नहीं कर सकते। उदाहरण के लिए। obj1 रखता है obj2 और obj2 रखता है obj1। इस तरह की स्थिति को हल करने के लिए आप कमजोर संदर्भों का उपयोग करते हैं।


12

एक डमी उत्तर: -

मुझे लगता है कि स्पष्टीकरण उपरोक्त उत्तर में दिया गया है, इसलिए मैं आपको केवल यह बताने वाला हूं कि आपको कहां उपयोग करना है STRONGऔर कहां उपयोग करना है WEAK:

का उपयोग Weak: - 1. प्रतिनिधि 2. आउटलेट 3. साक्षात्कार 4. नियंत्रण, आदि।

का उपयोग करें Strong: - हर जगह शेष है जो इसमें शामिल नहीं है WEAK


2
और इसमें क्या शामिल है: पी
रजनीश071

3
webView, mapView, आदि
शुभम

4
वास्तव में अधिकांश सबव्यू जिसे हम स्टोरीबोर्ड पर खींचते हैं और छोड़ते हैं
शुभम मिश्रा

8

मजबूत और कमजोर , ये कीवर्ड ऑब्जेक्टिव -सी में ऑब्जेक्ट ओनरशिप के चारों ओर घूमते हैं

वस्तु स्वामित्व क्या है?

पॉइंटर वैरिएबल उन वस्तुओं के स्वामित्व में हैं जो वे इंगित करते हैं।

  • जब किसी विधि (या फ़ंक्शन) में एक स्थानीय चर होता है जो किसी ऑब्जेक्ट की ओर इशारा करता है, तो उस चर को उस ऑब्जेक्ट को इंगित करने के लिए कहा जाता है।
  • जब किसी ऑब्जेक्ट में एक इंस्टेंस वैरिएबल होता है जो किसी अन्य ऑब्जेक्ट को इंगित करता है, तो पॉइंटर के साथ ऑब्जेक्ट को उस ऑब्जेक्ट को इंगित करने के लिए कहा जाता है।

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

एक चर वैकल्पिक रूप से उस ऑब्जेक्ट का स्वामित्व नहीं ले सकता है जो इसे इंगित करता है। एक चर जो किसी वस्तु का स्वामित्व नहीं लेता है उसे एक कमजोर संदर्भ के रूप में जाना जाता है ।

एक विस्तृत विवरण के लिए एक नज़र यहाँ @property और विशेषताओं Demystifying


6

यहाँ, Apple प्रलेखन ने विभिन्न उदाहरणों का उपयोग करके कमजोर और मजबूत संपत्ति के बीच अंतर को समझाया है:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

यहाँ, इस ब्लॉग में लेखक ने सभी संपत्तियों को एक ही जगह एकत्र किया है। यह गुण विशेषताओं की तुलना करने में मदद करेगा:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


6

मजबूत डिफ़ॉल्ट है। जब तक कोई मजबूत संकेतक होता है तब तक एक वस्तु "जीवित" रहती है।

कमजोर एक संदर्भ निर्दिष्ट करता है जो संदर्भित वस्तु को जीवित नहीं रखता है। कमजोर संदर्भ को शून्य पर सेट किया जाता है जब ऑब्जेक्ट के लिए कोई मजबूत संदर्भ नहीं होता है।


2

मजबूत और कमजोर संदर्भ को समझने के लिए नीचे दिए गए उदाहरण पर विचार करें, मान लें कि हमारे पास प्रदर्शन विधि के रूप में नामित विधि है।

 -(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
  }

ऊपर के तरीके मे myView वैरिएबल का दायरा DisplayLocalVariable मेथड तक ही सीमित है, एक बार मेथड समाप्त हो जाने पर माइ व्यू वैरिएबल जो UIView ऑब्जेक्ट को पकड़ रहा है वह मेमोरी से डिले हो जाएगा।

अब क्या होगा अगर हम अपने व्यू कंट्रोलर के जीवन चक्र के दौरान myView चर को पकड़ना चाहते हैं। इसके लिए हम उपयोगकर्ता नाम के रूप में प्रॉपर्टी बना सकते हैं जिसमें वेरिएबल myView (देखें @property(nonatomic,strong) UIView* usernameView;और self.usernameView = myView;नीचे कोड में) का मजबूत संदर्भ होगा , जैसा कि नीचे है,

@interface LoginViewController ()

@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}

- (void)displayLocalVariable
{
   UIView* myView = [[UIView alloc] init];
   NSLog(@"myView tag is = %ld", myView.tag);
   self.usernameView = myView;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

अब ऊपर दिए गए कोड में आप देख सकते हैं कि myView को self.usernameView और self.usernameView को सौंपा गया है। इसलिए myView को मेमोरी से तब तक नहीं हटाया जाएगा जब तक self.usernameView जीवित है।

  • कमजोर संदर्भ

अब myName को dummyNameView में असाइन करने पर विचार करें जो कि एक कमजोर संदर्भ है, इसके self.dummyNameView = myView;विपरीत मजबूत संदर्भ कमजोर MyView को केवल तब तक पकड़ेंगे जब तक कि मेरे विचार का सशक्त संदर्भ न हो। कमजोर संदर्भ समझने के लिए नीचे कोड देखें,

-(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
     self.dummyNameView = myView;
  }

उपरोक्त कोड में myView (यानी self.dummyNameView का मेरे संदर्भ में कमजोर संदर्भ है) पर कमजोर संदर्भ है, लेकिन myView का कोई मजबूत संदर्भ नहीं है, इसलिए self.dummyNameView myView मान को रोक नहीं पाएगा।

अब फिर से नीचे दिए गए कोड पर विचार करें,

-(void)displayLocalVariable
      {
         UIView* myView = [[UIView alloc] init];
         NSLog(@"myView tag is = %ld", myView.tag);
         self.usernameView = myView;
         self.dummyNameView = myView;
      } 

उपरोक्त कोड में self.usernameView में myView का एक मजबूत संदर्भ है, इसलिए self.dummyNameView का अब विधि समाप्त होने के बाद भी myView का एक मूल्य होगा क्योंकि myView का इससे जुड़ा एक मजबूत संदर्भ है।

अब जब भी हम किसी वैरिएबल का एक मजबूत संदर्भ बनाते हैं तो यह बरकरार रहता है कि गिनती एक से बढ़ जाती है और जब तक यह गिनती 0 तक नहीं पहुंच जाती तब तक वैरिएबल डील नहीं किया जाएगा।

उम्मीद है की यह मदद करेगा।


2019-07-25 12: 33: 15.479002 + 0530 स्ट्रांगएंडवैक [6329: 245483] मेरा नाम = एबीसी 2019-07-25 12: 33: 15.479226 + 0530 स्ट्रांगअंडवेक (6329: 245483] मेरा नाम मजबूत = एबीसी 2019- के लिए है। 07-25 12: 33: 15.479418 + 0530 स्ट्रांगअंडवेक [6329: 245483] मेरा नाम कमजोर = एबीसी के लिए है इसमें आपने कमजोर संपत्ति को myname का मूल्य नहीं बताया है। लेकिन मुझे दोनों संदर्भों के लिए ABC से myname मान मिल रहा है .. ..? क्या आप अधिक स्पष्ट उत्तर दे सकते हैं ....
थैंक्स

@Raviteja_DevObal एआरसी इसे तुरंत करने का वादा नहीं करता है (यानी स्ट्रिंग @ "एबीसी" से
निपटना

@Raviteja_DevObal जैसा कि यहां बताया गया है कि तार इसके लिए एक बुरा उदाहरण हैं। मैंने अपना उत्तर UIView ऑब्जेक्ट के साथ अपडेट किया है, आशा है कि यह मदद करता है।
महादेव मंडले

1

मजबूत : मूल रूप से गुणों के साथ उपयोग किया जाता है जिसे हम अन्य वर्गों में / से डेटा प्राप्त करने या भेजने के लिए उपयोग करते हैं। कमजोर : आमतौर पर सभी आउटलेट, कनेक्शन इंटरफ़ेस से कमजोर प्रकार के होते हैं।

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

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