2012-08-07 12 views
5

संभव डुप्लिकेट:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0प्रारंभ करने NSMutableArray और क्षमता के बिना

कोड की पंक्ति निम्नलिखित के बीच क्या अंतर है? सटीक लाभ और नुकसान क्या है? मान लीजिए कि मैं 3 addObject ऑपरेशन करूंगा।

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 5]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
+0

यह उन प्रश्नों में से किसी एक का सही डुप्लिकेट नहीं है, हालांकि यह शीर्ष पर बहुत करीब है। – JeremyP

+0

संभावित डुप्लिकेट [उद्देश्य-सी एनएसएआरएआरआई इनिट बनाम initWithCapacity: 0] (http://stackoverflow.com/questions/6077422/objective-c-nsarray-init-versus-initwithcapacity0), [NSMutableArray initWithCapacity: nuances] (http: //stackoverflow.com/questions/3948062/), –

उत्तर

5

नियमित रूप से वस्तु उन्मुख भाषाओं और भिन्न आकारों की सरणियों के साथ अंतर नहीं है: भूमि के ऊपर आप मिल जाएगा और स्मृति स्तर पर पेज दोष।

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

Apple's documentation से:

arrayWithCapacity:

बनाता है और पर्याप्त आबंटित स्मृति के साथ एक NSMutableArray ऑब्जेक्ट शुरू में वस्तुओं की दी गई संख्या धारण करने के लिए। ... नई सरणी की प्रारंभिक क्षमता। रिटर्न वैल्यू के साथ एक नई एनएसएमयूटेबलएरे ऑब्जेक्ट numItems ऑब्जेक्ट्स रखने के लिए पर्याप्त आवंटित स्मृति।

+0

एक अच्छा अनुमान है, लेकिन वास्तव में यह नहीं हो रहा है .... जेरेमी का जवाब देखें। – bbum

+0

@bbum मुझे लगता है कि यह अनुमान नहीं है। यह एक उचित स्पष्टीकरण है। जेरेमी के जवाब में, वह इस्तेमाल किया जा सकता है। – Saad

+1

@ साद नहीं, वास्तव में, यह एक अनुमान है। स्रोत पढ़ें (सीएफफ़ाउंडेशन ओपन सोर्स है)। यदि आप 100,000 स्लॉट वाले सरणी का अनुरोध करते हैं, तो यह आवश्यक समय से पहले उन सभी स्लॉट आवंटित नहीं करेगा। डेटा संरचना एक फ्लैट सरणी की तुलना में थोड़ा अधिक जटिल है और, इस प्रकार, दस्तावेज़ीकरण भ्रामक है, लेकिन पूरी तरह से गलत नहीं है। – bbum

8

कार्यात्मक रूप से दोनों कथन समान हैं।

पहले मामले में, आप रन टाइम को एक संकेत दे रहे हैं कि आप जल्द ही सरणी में पांच ऑब्जेक्ट्स जोड़ रहे होंगे ताकि अगर इसे पसंद किया जा सके, तो उनके लिए कुछ जगह प्रीलोकेट करें। इसका मतलब है कि पहले पांच addObject: आमंत्रण पहले कथन का उपयोग करके मामूली तेजी से हो सकते हैं।

हालांकि, इस बात की कोई गारंटी नहीं है कि रन टाइम कुछ भी करता है लेकिन संकेत को अनदेखा करता है। मैंने कभी भी initWithCapacity: का उपयोग नहीं किया। अगर मुझे कभी ऐसी स्थिति मिलती है जहां addObject: एक महत्वपूर्ण प्रदर्शन बाधा है, तो मैं यह देखने के लिए कोशिश कर सकता हूं कि चीजें बेहतर होती हैं या नहीं।

+1

दाएं - या, इसे स्पष्ट रूप से रखने के लिए: संकेतित संस्करण से परेशान न हों। – bbum

संबंधित मुद्दे