ठीक है, यह सौदा है।
जब आप ऐसा तरह एक संपत्ति ...
@property (nonAtomic, retain) NSString myName;
... क्योंकि संपत्ति की चूक की कमान परिभाषित इसकी वास्तव में के रूप में यह परिभाषित करने की तरह:
@property (nonAtomic, readwrite, retain, getter=getMyName,setter=setMyName) NSString myName;
जब आप @synthesize myName;
का उपयोग दृश्यों के पीछे, शिकायतकर्ता एक गेटटर विधि उत्पन्न करता है जो इस तरह कुछ दिखता है:
-(void) setMyName:(NSString *) aString{
if (!(myString==aString) { //test if a string is the same **object** as the current myString
if (aString != nil) { // if nil we don't want to send a retain
[aString retain]; // increment the retain count by one
}
[myString release]; //decrement the retain count of the currently assigned string by one.
myString=nil; //set the pointer to nil to ensure we don't point to the old string object
myString=aString; //assign the newly retained object to the myString symbol
}
}
जैसा कि आप देख सकते हैं, किसी भी स्रोत से किसी भी स्ट्रिंग, किसी भी पूर्व रखरखाव गिनती, ऑटोरेलेस्ड या नहीं, स्वचालित रूप से असाइनमेंट पर विधि द्वारा बनाए रखा जाएगा और जब कोई नया मान असाइन किया जाएगा, तो यह विधि द्वारा स्वचालित रूप से जारी किया जाएगा। एकाधिक असाइनमेंट बनाए रखने की गिनती को ढेर नहीं करेंगे। जब तक आप जेनरेट किए गए सेटर का उपयोग करते हैं, तब तक निर्दिष्ट ऑब्जेक्ट (इस मामले में एस्ट्रिंग) में हमेशा एक गिनती होगी जो इसे कक्षा में जीवंत रखेगी।
यह वह जगह है आपने ऐसा क्यों कर सकते हैं ...
self.myName=[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"]
;
यह करने के लिए बिना:
self.myName=[[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"] retain];
... और नहीं चिंता करने की है, तो स्ट्रिंग मान अचानक गायब हो जाएगा जब autoreleasepool नालियों की है।
हालांकि अगर आप कभी भी फोन ...
[self.myName release];
... dealloc
के बाहर कहीं भी, तो संपत्ति में वस्तु जब तक आप इसे लगातार ट्रैक nilled हो सकती है। उसी टोकन से, यदि आप कॉल करते हैं ..
[self.myName retain];
... कहीं भी, तो संपत्ति में वस्तु का रिसाव हो जाएगा (संभवतः के बाद भी स्वयं वस्तु पुनः आवंटित की जाती किया गया है।)
यही कारण है कि मैं कहता हूँ बनाए रखने या सौंपा किसी भी वस्तु autorelease करने के लिए कभी नहीं या एक संपत्ति में नकल की। यह केवल व्यर्थ नहीं बल्कि उत्पादक काउंटर है। यह इस प्रकार है कि आप केवल कॉल करने के लिए एक संपत्ति को रिलीज क्योंकि सेटर द्वारा बनाए रखने गिनती की कुशल ट्रैकिंग मतलब है कि आप संपत्ति शून्य तुम अब भी जरूरत हो सकती है, भले ही कर सकते हैं कि जब आप स्वयं वस्तु के साथ किया जाता है चाहता हूँ।
autorelease एक संपत्ति के लिए आवश्यक कभी नहीं रहा है, क्योंकि संपत्ति हमेशा स्वयं वस्तु और किसी भी अन्य वस्तु आंतरिक प्रतिधारण संभाल चाहिए, अगर यह आत्म वस्तु की संपत्ति का उपयोग करता है के द्वारा बनाए रखा है।
एक बार जब आप समझते हैं कि क्या उत्पन्न accessors अंदर पर चला जाता है, नियम स्पष्ट हैं। संपत्ति की वस्तु को स्पष्ट रूप से कभी न रखें। Dealloc में किसी संपत्ति की ऑब्जेक्ट को कभी भी न छोड़ें। किसी संपत्ति की ऑब्जेक्ट को स्वतः न करें।
इन नियमों के लिए स्पष्ट अनुशासन हमेशा स्वयं ऑब्जेक्ट में self.propertyName संदर्भों का उपयोग करना है ताकि यह सुनिश्चित किया जा सके कि संपत्ति का प्रतिधारण स्वचालित रूप से प्रबंधित हो। ,
self.locationManager = [[[CLLocationManager alloc] init]autorelease];
अब इस चर सिर्फ एक बार बनाए रखा गया है: इस प्रकार
self.locationManager = [[CLLocationManager alloc] init];
यह शायद सबसे अच्छा लिखा है:
अपने संपादित करें 1 पर, बुद्धिमान बनाए रखने-गिनती, वे एक ही हैं। उन वस्तुओं को सिर्फ एक बार बनाए रखा जाता है। सभी सुविधा कार्यों में एक अंतर्निहित ऑटो-रिलीज है। यदि आपको init कथन में शब्द आवंटन नहीं दिखाई देता है, तो चर स्वचालित है। आप alloc का उपयोग करते हैं, तो आप –