objective c - What increases an object's retain count? -


यहाँ कोड है जिसका मैं उल्लेख कर रहा हूं।

  // Person.h। @ इंटरफेस व्यक्ति : NSObject {NSString * firstName; NSString * lastName; } @ एंड // व्यक्ति .im @implementation person - (id) init {if (! [Init in!]) वापस नील; FirstName = @ "जॉन"; LastName = @ "डो"; } @ एंड // MyClass.m @implementation MyClass ..... - (NSArray *) getPeople {NSMutableArray * array = [[NSMutableArray alloc] init]; Int i; के लिए (i = 0; i & lt; 10; i ++) {व्यक्ति * p = [[व्यक्ति आलोक] init]; [सरणी addObject: p]; } वापसी सरणी; } ..... @ <  

अब, मुझे पता है कि इस नमूना कोड में कोई स्मृति प्रबंधन नहीं है। क्या आवश्यक होगा?

GetPeople लूप में, मैं एक व्यक्ति (कुल संख्या 1) को आवंटित कर रहा हूं, फिर इसे सरणी में जोड़ रहा हूं। बनाए रखने की गिनती अब 2 है, है ना? अगर यह दो है, तो क्या मुझे इसे सरणी में जोड़ने के बाद, मुझे वापस रखने के लिए 1 को वापस लेना चाहिए?

क्या मैं सही में कॉलर की ज़िम्मेदारी है विधि द्वारा लौटे? (जो व्यक्ति की स्मृति को भी मुक्त करेगा, और उनके उदाहरण चर, मान लेंगे कि उनकी गणना 1)।

मैंने एप्पल के मेमोरी प्रबंधन दस्तावेज पढ़ा है, लेकिन मुझे लगता है कि मैं किस बारे में सबसे ज्यादा अस्पष्ट हूँ क्या एक वस्तु बढ़ जाती है बढ़ जाती है? मुझे लगता है कि मैं यह सोच रहा हूं कि कौन जिम्मेदारी जारी करना है, हालांकि, हालांकि। ऐप्पल के अनुसार यह मूलभूत नियम है:

यदि आप किसी ऐसी विधि का उपयोग करके इसे बनाते हैं, जिसका नाम "आलोक" या "नया" या "प्रतिलिपि" से शुरू होता है या इसमें "कॉपी" होता है उदाहरण के लिए, alloc, newObject, या mutableCopy), या यदि आप इसे एक बनाए संदेश भेजें आप जिन वस्तुओं की रिहाई या ऑटोोरिएज का उपयोग कर रहे हैं, उनके स्वामित्व को त्यागने के लिए आप जिम्मेदार हैं किसी भी अन्य समय आप एक वस्तु प्राप्त करते हैं, तो आपको इसे रिलीज़ नहीं करना चाहिए।

बॉबडीविल का वाक्य "केवल आप को उस वस्तु में स्पष्ट रूप से जोड़ने वाले बनाए रखने के बारे में चिंता करें" इसे मेरे लिए क्लिक करें एप्पल में स्वामित्व नीति को पढ़ने के बाद, अनिवार्य रूप से, वस्तु / विधि जिसने नई वस्तु बनाई, वह उसमें जारी / इसका / ब्याज के लिए जिम्मेदार है। क्या यह सही है?

अब, मान लीजिए मैं एक विधि कहता हूं, वह वस्तु प्राप्त करता है, और इसे आवृत्ति चर में निर्दिष्ट करता है मुझे प्राप्त हुए वस्तु को सही रखने की आवश्यकता है, क्योंकि मुझे अभी भी इसमें रुचि है?

अगर इनमें से कोई भी गलत है, तो मुझे बताएं।

आप सही हैं कि एक सरणी में जोड़ने के बाद यह संख्या 2 है। हालांकि, आपको केवल आइटम को स्पष्ट रूप से बनाए रखने के बारे में चिंता करना चाहिए।

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

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

  व्यक्ति * p = [[ व्यक्ति alloc] init]; // 1 को बनाए रखने के लिए, आप [सरणी addObject: p]; // सरणी पी के साथ सौदों हालांकि यह चाहता है [पी रिलीज]; // आप कर चुके हैं, तो इसे रिलीज करें  

इसके अलावा, जैसा कि मैंने ऊपर कहा था, आप ऑब्जेक्ट के दौरान ही ऑब्जेक्ट ही बनाते हैं या आम तौर पर कॉपी करते हैं, ताकि दूसरे पक्ष के साथ संगत हो चीजें, आपको ऑररेलेलेज्ड सरणी को वापस करना चाहिए, जिससे कि प्राप्तकर्ता विधि के कॉलर का मालिक नहीं है।

  return [array autorelease];  

संपादित करें: सही है, अगर आप इसे बनाते हैं, तो आपको इसे रिलीज़ करना होगा। यदि आप इसमें रुचि रखते हैं (बनाए रखने के द्वारा) तो आपको इसे जारी करना होगा।


Comments

Popular posts from this blog

c# - ListView onScroll event -

PHP - get image from byte array -

Linux Terminal Problem with Non-Canonical Terminal I/O app -