2015-08-15 15 views
5
  1. वहाँ तीन मोड सरणी चर बनाने के लिए कर रहे हैं की स्मृति प्रबंधन:शाब्दिक वाक्य रचना

    • NSArray *array = @[@0, @1];

    • NSArray *array = [NSArray arrayWithObjects:@0, @1, nil];

    • NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];

  2. जब मैं बनाने के लिए दूसरे मोड का उपयोग करता हूं, तो varialbe "सरणी" autoreleasepool पर फेंक दिया जाएगा; जब मैं तीसरे का उपयोग करता हूं, तो var की retainCount 1 होगी लेकिन ऑटोरेलीपूल पर नहीं फेंक दिया जाएगा; मैं जानना चाहता हूं कि पहले मोड का प्रभाव दूसरे मोड या तीसरे मोड के साथ होता है;

+0

Obligatory www.whentouseretaincount.com। :) – bbum

उत्तर

2

सामान्य नियम है कि आप "alloc" या "नया" या युक्त "कॉपी 'से शुरू विधि आह्वान नहीं किया है, तो आपके पास ऑब्जेक्ट का स्वामित्व नहीं है और इसे न छोड़ने का अधिकार है और न ही इसे जारी करने की ज़िम्मेदारी है। हालांकि, निश्चित रूप से, यदि आप स्पष्ट रूप से किसी ऑब्जेक्ट को बनाए रखते हैं तो आपको इसे रिलीज़ के साथ संतुलित करना होगा (या ऑटोरेलीज, जो इसे रिलीज़ करने की व्यवस्था का एक और तरीका है)।

ऑटोरेलीज पूल में कौन सी वस्तुएं हो सकती हैं या नहीं हो सकती हैं, इस बारे में तर्क न दें। इसके अलावा, गणना बनाए रखने के बारे में तर्क करने की कोशिश मत करो। स्वामित्व अधिकारों और जिम्मेदारियों के बारे में बस चिंता करें।

+0

यह भी ध्यान रखना महत्वपूर्ण है कि एआरसी के साथ, ऑटोरेलीज के कई उदाहरण अनुकूलित किए गए हैं, इसलिए ऑटोरेलीपूल के बारे में तर्क और भी कठिन और फलहीन है। –

+0

हालांकि इस उत्तर में अच्छी जानकारी है, लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। # 1 # 2 या # 3 की तरह है? – rmaddy

+0

@rmaddy, मुझे लगता है कि यह ठीक है इसका जवाब देता है। # 1 में "एलोक" या "नया" या "प्रतिलिपि" युक्त एक विधि का आविष्कार शामिल नहीं है। # 2 में भी शामिल नहीं है। # 3 करता है। तो, मैं उस पाठक पर भरोसा नहीं कर सकता जिससे उस से निष्कर्ष निकाला जा सके? –

3

पहला और दूसरा मोड का परिणाम समान है। पहले मोड दूसरा

स्रोत की सुविधा वाक्य रचना है: Objective-C Literals

+6

बिल्कुल सही नहीं है: शब्दकोष '+ [NSArray arrayWithObjects: count:]' तक विस्तारित है। लेकिन autorelease के संबंध में परिणाम वही है, जैसा आपने कहा था। –

1

हमेशा डेल्टा के रूप में बनाए रखने की गणना पर विचार करें। तो: - है NSString *foo = @"foo";

1. NSArray *array = @[@0, @1]; 

array गिनती +0 बनाए रखने है (कि यह बरकरार रखा है और उसके बाद निर्माण पर autoreleased काफी हद तक अप्रासंगिक है और, वास्तव में, यह नहीं बरकरार रखा गया हो सकता है और सब पर autoreleased सटीक वही +0 अर्थशास्त्र, लेकिन कार्यान्वयन विवरण एक retain/autorelease नहीं हैं)।

2. NSArray *array = [NSArray arrayWithObjects:@0, @1, nil]; 

उतना ही (1), बस अधिक उंगली अभ्यास के साथ।

NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil]; 

array एक +1 जहाँ तक आप चिंतित हैं गिनती बनाए रखने की है। आपको केवल इतना ही पता होना चाहिए कि array के लिए आपके कोड की ज़िम्मेदारियों को छोड़ने के लिए, यह ऑब्जेक्ट release डी या autorelease डी होना चाहिए। चाहे इसे +1 बनाए रखने के साथ बनाया गया हो ... चाहे वह 42 की आंतरिक रखरखाव की गिनती हो ... चाहे वह 5 बार बनाए रखा गया हो और 4 ऑटोटेलेटेड हो .... सभी आपके कोड के लिए पूरी तरह से अप्रासंगिक हैं।

1

अलावा स्मृति आवंटन का ब्यौरा से, वहाँ

NSArray* array = @[obj1, obj2, obj3]; 

और

NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil]; 

के बीच एक बड़ा अंतर दूसरा एक पहले शून्य तर्क में बंद हो जाएगा। आप तीन तत्वों के साथ एक सरणी की उम्मीद करते हैं, लेकिन अगर obj1! = Nil और obj2 == nil तो परिणाम एक तत्व के साथ एक सरणी है। अगर कोई obj1, obj2 या obj3 शून्य है तो पहला अपवाद फेंकता है।

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