मैं ओब्ज-सी के लिए नया हूं, इसलिए मेरा पहला सवाल है:
क्या अंतर हैं strong
और weak
में @property
वस्तुओं के लिए संकेत की घोषणाओं?
इसके अलावा, क्या nonatomic
मतलब है?
मैं ओब्ज-सी के लिए नया हूं, इसलिए मेरा पहला सवाल है:
क्या अंतर हैं strong
और weak
में @property
वस्तुओं के लिए संकेत की घोषणाओं?
इसके अलावा, क्या nonatomic
मतलब है?
जवाबों:
एक मजबूत संदर्भ (जिसका उपयोग आप ज्यादातर मामलों में करेंगे) का मतलब है कि आप इस संपत्ति / चर के साथ जिस वस्तु को संदर्भित कर रहे हैं उसे "खुद" करना चाहते हैं। कंपाइलर इस बात का ध्यान रखेगा कि आप जिस भी वस्तु को इस संपत्ति को सौंपेंगे, वह तब तक नष्ट नहीं होगी, जब तक आप इसे एक मजबूत संदर्भ के साथ इंगित नहीं करते। केवल एक बार जब आप संपत्ति को nil
नष्ट करने के लिए संपत्ति निर्धारित करते हैं (जब तक कि एक या अधिक अन्य वस्तुएं भी इसका एक मजबूत संदर्भ नहीं रखती हैं)।
इसके विपरीत, एक कमजोर संदर्भ के साथ आप संकेत करते हैं कि आप ऑब्जेक्ट के जीवनकाल पर नियंत्रण नहीं रखना चाहते हैं। जिस ऑब्जेक्ट को आप कमजोर रूप से संदर्भित कर रहे हैं, वह केवल उसी पर रहता है क्योंकि कम से कम एक अन्य वस्तु उसके लिए एक मजबूत संदर्भ रखती है। एक बार जब ऐसा नहीं होता है, तो वस्तु नष्ट हो जाती है और आपकी कमजोर संपत्ति स्वचालित रूप से सेट हो जाएगी nil
। IOS में कमजोर संदर्भों के सबसे अधिक उपयोग मामले हैं:
प्रतिनिधि गुण, जिन्हें अक्सर चक्र बनाए रखने से बचने के लिए कमजोर रूप से संदर्भित किया जाता है, और
किसी कंट्रोलर के मुख्य दृश्य के साक्षात्कार / नियंत्रण क्योंकि वे दृश्य पहले से ही मुख्य दृश्य द्वारा दृढ़ता से आयोजित किए जाते हैं।
एटॉमिक बनाम नॉनटॉमिक, गेटर और सेटर विधियों की थ्रेड सुरक्षा को संदर्भित करता है जो कंपाइलर संपत्ति के लिए संश्लेषित करता है। परमाणु (डिफ़ॉल्ट) कंपाइलर को एक्सेसर के तरीकों को थ्रेड-सेफ बनाने के लिए कहता है (एक आइवर एक्सेस होने से पहले एक लॉक जोड़कर) और गैर-परमाणु इसके विपरीत करता है। गैर-परमाणु का लाभ थोड़ा अधिक है। IOS पर, Apple लगभग सभी संपत्तियों के लिए गैर-परमाणु का उपयोग करता है इसलिए सामान्य सलाह यही है कि आप भी ऐसा ही करें।
atomic
गारंटी देता है कि संपत्ति को एक ही समय में कई थ्रेड्स से सुरक्षित रूप से पढ़ा और लिखा जा सकता है। इसका मतलब ऐसी वस्तु से नहीं है जिसके गुण सभी atomic
स्वचालित रूप से थ्रेड-सुरक्षित हैं।
गुब्बारे के संदर्भ में मजबूत और कमजोर संदर्भों के बारे में सोचना मददगार हो सकता है।
एक गुब्बारा तब तक नहीं उड़ेगा, जब तक कम से कम एक व्यक्ति उससे जुड़े एक तार को पकड़े हुए है। स्ट्रिंग्स रखने वाले लोगों की संख्या रिटेन काउंट है। जब कोई भी एक स्ट्रिंग को पकड़ नहीं रहा है, तो बैलून उड़ जाएगा (डीलॉक)। कई लोगों के पास एक ही गुब्बारे के तार हो सकते हैं। आप मजबूत और कमजोर दोनों संदर्भों के साथ संदर्भित ऑब्जेक्ट पर गुण / कॉल विधि प्राप्त / सेट कर सकते हैं।
एक मजबूत संदर्भ उस गुब्बारे को एक स्ट्रिंग पर रखने जैसा है। जब तक आप गुब्बारे से जुड़ी एक स्ट्रिंग को पकड़ रहे हैं, यह दूर नहीं उड़ जाएगा।
एक कमजोर संदर्भ गुब्बारे को देखने जैसा है। आप इसे देख सकते हैं, इसके गुणों तक पहुँच सकते हैं, इसे कॉल कर सकते हैं, लेकिन आपके पास उस गुब्बारे के लिए कोई स्ट्रिंग नहीं है। यदि स्ट्रिंग पर सभी लोग चलते हैं, तो गुब्बारा उड़ जाता है, और आप इसे एक्सेस नहीं कर सकते।
strong
और weak
वास्तव में मतलब।
मजबूत : इसके लिए आने वाले मूल्य प्रदान करता है, यह आने वाले मूल्य को बनाए रखेगा और उदाहरण चर के मौजूदा मूल्य को जारी करेगा
कमजोर : इसे बनाए रखने के बिना इसे आने वाले मूल्य प्रदान करेगा।
तो मूल अंतर नए चर को बनाए रखने का है। सामान्य तौर पर आप इसे बनाए रखना चाहते हैं, लेकिन ऐसी परिस्थितियां हैं, जहां आप इसे नहीं चाहते हैं अन्यथा आप एक चक्र बनाए रखेंगे और वस्तुओं को स्मृति मुक्त नहीं कर सकते। उदाहरण के लिए। obj1 रखता है obj2 और obj2 रखता है obj1। इस तरह की स्थिति को हल करने के लिए आप कमजोर संदर्भों का उपयोग करते हैं।
एक डमी उत्तर: -
मुझे लगता है कि स्पष्टीकरण उपरोक्त उत्तर में दिया गया है, इसलिए मैं आपको केवल यह बताने वाला हूं कि आपको कहां उपयोग करना है STRONG
और कहां उपयोग करना है WEAK
:
का उपयोग Weak
: -
1. प्रतिनिधि 2. आउटलेट 3. साक्षात्कार 4. नियंत्रण, आदि।
का उपयोग करें Strong
: -
हर जगह शेष है जो इसमें शामिल नहीं है WEAK
।
मजबूत और कमजोर , ये कीवर्ड ऑब्जेक्टिव -सी में ऑब्जेक्ट ओनरशिप के चारों ओर घूमते हैं
वस्तु स्वामित्व क्या है?
पॉइंटर वैरिएबल उन वस्तुओं के स्वामित्व में हैं जो वे इंगित करते हैं।
किसी भी समय एक संकेतक चर एक वस्तु को इंगित करता है, उस वस्तु का एक मालिक है और जीवित रहेगा। इसे एक मजबूत संदर्भ के रूप में जाना जाता है ।
एक चर वैकल्पिक रूप से उस ऑब्जेक्ट का स्वामित्व नहीं ले सकता है जो इसे इंगित करता है। एक चर जो किसी वस्तु का स्वामित्व नहीं लेता है उसे एक कमजोर संदर्भ के रूप में जाना जाता है ।
एक विस्तृत विवरण के लिए एक नज़र यहाँ @property और विशेषताओं Demystifying
यहाँ, Apple प्रलेखन ने विभिन्न उदाहरणों का उपयोग करके कमजोर और मजबूत संपत्ति के बीच अंतर को समझाया है:
यहाँ, इस ब्लॉग में लेखक ने सभी संपत्तियों को एक ही जगह एकत्र किया है। यह गुण विशेषताओं की तुलना करने में मदद करेगा:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
मजबूत डिफ़ॉल्ट है। जब तक कोई मजबूत संकेतक होता है तब तक एक वस्तु "जीवित" रहती है।
कमजोर एक संदर्भ निर्दिष्ट करता है जो संदर्भित वस्तु को जीवित नहीं रखता है। कमजोर संदर्भ को शून्य पर सेट किया जाता है जब ऑब्जेक्ट के लिए कोई मजबूत संदर्भ नहीं होता है।
मजबूत और कमजोर संदर्भ को समझने के लिए नीचे दिए गए उदाहरण पर विचार करें, मान लें कि हमारे पास प्रदर्शन विधि के रूप में नामित विधि है।
-(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 तक नहीं पहुंच जाती तब तक वैरिएबल डील नहीं किया जाएगा।
उम्मीद है की यह मदद करेगा।
मजबूत : मूल रूप से गुणों के साथ उपयोग किया जाता है जिसे हम अन्य वर्गों में / से डेटा प्राप्त करने या भेजने के लिए उपयोग करते हैं। कमजोर : आमतौर पर सभी आउटलेट, कनेक्शन इंटरफ़ेस से कमजोर प्रकार के होते हैं।
नॉनटॉमिक : इस प्रकार के गुणों का उपयोग उन परिस्थितियों में किया जाता है जब हम अपने आउटलेट या ऑब्जेक्ट को एक साथ अलग-अलग थ्रेड्स में साझा नहीं करना चाहते हैं। दूसरे शब्दों में, एक समय में एक धागे से निपटने के लिए गैर-परमाणु उदाहरण हमारे गुण बनाते हैं। उम्मीद है कि यह आपके लिए मददगार हो।