किसी थ्रेड से पहले गायब होने से वस्तुओं को रोकने के लिए उन्हें रोकने का मौका मिलने के लिए संदर्भित बहु थ्रेडेड वातावरण में परमाणु गुण आवश्यक हैं।
पर विचार करें एक प्राप्त एक्सेसर की भोली कार्यान्वयन:
@interface MyObject : NSObject
{
id myPropertyIVar;
}
-(id) myProperty;
@end
@implementation MyObject
-(id) myProperty
{
return myPropertyIvar;
}
// other stuff
@end
यह सिवाय इसके कि यदि आप दिए गए मान -myProperty से दिए गए मान को बनाए रखना से पहले MyObject के कहने रिलीज अच्छी तरह से पुनः आवंटित की जाती किया जा सकता है सब ठीक है। इस कारण से, यह इस तरह -myProperty लागू करने के लिए सुरक्षित है:
-(id) myProperty
{
return [[myPropertyIvar retain] autorelease];
}
यह अब एक ही लड़ी वातावरण में पूरी तरह से सुरक्षित है।
दुर्भाग्य से, एक बहुप्रचारित वातावरण में दौड़ की स्थिति है।
- MyObject के कहने इवर के कारण जारी किया गया और एक अन्य धागे से पुनः आवंटित की जाती है: धागा किसी भी समय बाधित हो जाए इससे पहले बनाए रखने गिनती बनाए रखने की संख्या बढ़ जाने के बाद निम्न में से किसी आप एक कचरा सूचक प्राप्त करने के लिए कारण होगा जारी होने की और पुनः आवंटित की जाती
- myProperty एक और धागा पुराने संस्करण के कारण द्वारा पुन: सौंपा है रिलीज होने और
पुनः आवंटित की जाती इस कारण से, सभी संपत्ति एक ताला द्वारा संरक्षित किया जाना चाहिए करने के लिए एक्सेस करता है। प्राप्तकर्ता इस तरह कुछ दिखता है।
-(id) myProperty
{
// lock
return [[myPropertyIvar retain] autorelease];
// unlock
}
सेट एक्सेसर इसी तरह से सुरक्षित है और इसलिए है -dealloc
में रिलीज है यहाँ का जवाब http://stackoverflow.com/a/32942413/1961064 –