एक पुस्तक में, निम्नलिखित कहा गया है:उद्देश्य-सी में, स्वामित्व ऑब्जेक्ट के लिए है, परिवर्तनीय या पॉइंटर्स नहीं?
तो तुम कैसे जानते हो जब एक वस्तु के स्वामित्व में है, और किसके द्वारा? निम्न उदाहरण पर विचार करें:
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;
इस उदाहरण में, आप
str
के लिएalloc
कीवर्ड का उपयोग, तो आप खुदstr
। इसलिए, जब आपको इसकी आवश्यकता नहीं है, तो आपको इसे रिलीज़ करने की आवश्यकता है। हालांकि,str2
बसstr
पर इंगित कर रहा है, इसलिए आपके पासstr2
का स्वामित्व नहीं है, जिसका अर्थ है कि कोstr2
रिलीज़ करने की आवश्यकता नहीं है जब आप इसका उपयोग कर रहे हैं।
मैंने सोचा था कि स्वामित्व वस्तु, चर नहीं या सूचक है ... इसलिए हम यह नहीं कह सकते कि हम "खुद str
" या "खुद str2
" ... हम एक वस्तु है, जो या तो द्वारा की ओर इशारा कर रहा है के मालिक हैं str
या str2
, और यदि हम [str release]
या [str2 release]
का उपयोग करते हैं, तो यह वही है।
अन्य वर्णन है:
उदाहरण के लिए, उदाहरण के पिछले अनुभाग में उपयोग किया जाता है पर विचार करें:
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---
str2
जारी करने के लिए है क्योंकि आप एक मुक्त नहीं कर सकते एक रनटाइम त्रुटि में परिणाम होगा प्रयास कर रहा है वस्तु आपके स्वामित्व में नहीं है।
हम वास्तव में [str2 release]
का उपयोग कर सकते हैं यदि इसे [str release]
से पहले कहा जाता है। यदि हम ऐसा करते हैं, तो लाइन [str release]
त्रुटि उत्पन्न करेगी क्योंकि अब str
साथ ही str2
दोनों खतरनाक पॉइंटर्स हैं, और माना जाता है कि release
ऑब्जेक्ट को पहली बार भेजा गया था, संदर्भ संख्या 0 हो गई, और dealloc
तुरंत कॉल किया गया था, और स्मृति को सी फ़ंक्शन free()
द्वारा मुक्त किया गया था।
क्या उपरोक्त सही है, या शायद कुछ और सुधारने के लिए है?
+1, लेकिन नए कोड में [एआरसी] (http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-transitioningToARC/Introduction/Introduction.html) का उपयोग करने पर विचार करें। – rid
+1, अच्छा सवाल, बीटीडब्ल्यू। –
आप सही हैं। किताब या तो बहुत भ्रमित या गलत है। – Saphrosit