2009-07-01 8 views
9

मैं एक ही मूल्य की वस्तुओं के साथ एक एनएसएआरएआरई बनाना चाहता हूं (एनएसएनंबर को सभी को 1 से शुरू किया गया है) लेकिन गणना अन्य चर पर आधारित है। सी-स्टाइल सरणी से संबंधित एक को छोड़कर एनएसएआरएआरई के किसी भी इंटियालाइज़र के साथ ऐसा करने का कोई तरीका प्रतीत नहीं होता है।गिनती एन के साथ शुरू की गई एनएसएआरएआरई बनाना, सभी ऑब्जेक्ट

कोई विचार अगर ऐसा करने का कोई छोटा तरीका है?

यह मैं के लिए क्या देख रहा हूँ है:

NSArray *array = [[NSArray alloc] initWithObject:[NSNumber numberWithInt:0] 
              count:anIntVariable]; 

NSNumber सिर्फ एक उदाहरण यहाँ है, यह अनिवार्य रूप से किसी भी NSObject हो सकता है।

उत्तर

3

मुझे कोई कारण नहीं दिख रहा है कि एक गैर-परिवर्तनीय प्रारूप में यह संरचना उपयोगी क्यों होगी, लेकिन मुझे यकीन है कि आपके कारण हैं।

मुझे नहीं लगता कि आप लेकिन पाश के लिए एक NSMutableArray उपयोग करने के लिए, एक साथ इसे बनाने के लिए किसी भी विकल्प नहीं है कि, और अगर यह वास्तव में महत्वपूर्ण है कि परिणाम परिवर्तनशील नहीं हो, एक NSArray का निर्माण और उपयोग करने arrayWithArray:

+2

अपरिवर्तनीय प्रतिलिपि प्राप्त करने के लिए, बस -copy का उपयोग करें, जो गिनती 1 (और नहीं autoreleased) को बनाए रखने के साथ एक सरणी देता है। –

+2

दरअसल, -कोपी एक अपरिवर्तनीय सरणी देता है जो आपके पास है और उसे रिलीज़/ऑटोरेलीज़ करना चाहिए - बरकरार गिनती कुछ भी हो सकती है कि कितने अन्य समान सरणी हो सकती हैं। बरकरार रखने के बारे में बात करने के लिए यह सबसे अच्छा नहीं है। –

+1

एक उत्कृष्ट भेद - मैं सही खड़ा हूं। आम तौर पर एक प्रतिलिपि एक नव-प्रारंभिक वस्तु देता है जिसे आप अकेले रखते हैं, लेकिन किसी विशिष्ट स्थिति में अर्थशास्त्र अन्यथा निर्देशित कर सकता है। जबकि बनाए रखने की गिनती आम तौर पर 1 होती है, यह * अधिक हो सकती है, और कोई और * इसे ऑटोरेलेज़ कर सकता था। इस प्रकार, आप सही हैं कि केवल अपने स्वयं के कॉल को बनाए रखने/रिलीज़/ऑटोरेलीज़ को संतुलित करने के लिए चिंतित होना सर्वोत्तम है। –

2

मैं @mmc से सहमत हूं, सुनिश्चित करें कि आपके पास ऐसी संरचना होने का एक वैध कारण है (केवल उसी ऑब्जेक्ट का उपयोग करने के बजाय एन बार), लेकिन मुझे लगता है कि आप ऐसा करते हैं।

वहाँ एक और तरीका है अपरिवर्तनीय सरणी जो थोड़ा तेज किया जाएगा के निर्माण के लिए है, लेकिन यह वस्तुओं की एक सी सरणी बनाने और NSArray के +arrayWithObject:count: विधि करने के लिए इसे पारित इस प्रकार की आवश्यकता है (जो एक autoreleased सरणी देता है, आप मन):

id anObject = [NSNumber numberWithInt:0]; 
id* buffer = (id*) malloc(sizeof(id) * anIntVariable); 
for (int i = 0; i < anIntVariable; i++) 
    buffer[i] = anObject; 
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable]; 
free(buffer); 

आप एक ही चीज़ को भी ट्रिकियर पॉइंटर गणित के साथ पूरा कर सकते हैं, लेकिन लाभ काफी मामूली हैं। अगर आप रुचि रखते हैं तो टिप्पणी करें।

+0

मेरा ज्ञान थोड़ा अपूर्ण है, इसलिए यदि मैं गलत हूं तो मुझे सही करें, लेकिन क्या यह * सरणी के सभी तत्वों को समान एनएसएनंबर ऑब्जेक्ट नहीं बनता है, और एक ही मूल्य के साथ शुरू की गई विभिन्न वस्तुओं को नहीं? मुझे लगता है कि यह किसी भी तरह से कोई फर्क नहीं पड़ता क्योंकि एनएसएनंबर अपरिवर्तनीय है, लेकिन हे वही है जो बून ने पूछा था। – alanlcode

+0

@alanlcode: यह संभवतः अपरिवर्तनीय है क्योंकि [NSNumber numberWithInt: 0] लगभग निश्चित रूप से एक सिंगलटन लौटाता है। NSNumber * के लिए गारनेटे अद्वितीय पॉइंटर्स का कोई तरीका नहीं है, इसलिए किसी भी तरह से आप इसे करते हैं तो आपको उस मुद्दे से निपटना होगा - और यदि यह कोई मुद्दा है तो आपको वास्तव में अपनी खुद की कक्षा को अर्थशास्त्र के साथ बनाना होगा दो ऑब्जेक्ट अलग होने के लिए और फिर भी उसी संख्या का प्रतिनिधित्व करते हैं। –

+0

बहुत सच है। इसके अलावा, NSValue (और NSNumber जो इसे उप-वर्गीकृत करते हैं) के उदाहरण अपरिवर्तनीय हैं, इसलिए यह समान मूल्य के एन ऑब्जेक्ट्स के लिए बहुत व्यर्थ है - प्रत्येक इंडेक्स पर एक ही ऑब्जेक्ट समान रूप से समान होता है और कम स्मृति का उपयोग करता है। यदि आप वास्तव में उत्सुक हैं, तो प्रत्येक बार जब आप ऑब्जेक्ट डालेंगे, तो एक -कोपी और -autorelease करने का प्रयास करें, और देखें कि उदाहरण अलग हैं या नहीं। मेरे पास ऐसा कुछ करने का कारण कभी नहीं था। –

2

शायद कारण यह है कि एनएसएआरएआरई पर ऐसी कोई विधि नहीं है कि अर्थशास्त्र अच्छी तरह परिभाषित नहीं है। आपके मामले के लिए, एक अपरिवर्तनीय NSNumber के साथ, तो सभी अलग-अलग अर्थशास्त्र समकक्ष हैं, लेकिन कल्पना करें कि यदि आप जो वस्तु जोड़ रहे थे वह एक म्यूटेबल ऑब्जेक्ट था, उदाहरण के लिए एनएसएमयूटेबल स्ट्रिंग।

तीन अलग-अलग अर्थ विज्ञान के होते हैं:

  • बनाए रखने - आप एक ही परिवर्तनशील स्ट्रिंग के लिए दस संकेत को रखना होगा, और किसी भी एक को बदलने में सभी दस बदल जाएगा।

  • प्रतिलिपि - आप एक ही मूल्य के साथ तार immeduable के लिए एक ही अपरिवर्तनीय स्ट्रिंग के लिए दस संकेत दिए गए, या संभवतः दस अलग संकेत को रखना होगा, लेकिन किसी भी तरह से आप उनमें से किसी को बदलने में सक्षम नहीं होगा ।

  • mutableCopy - आप दस अलग-अलग परिवर्तनीय स्ट्रिंग ऑब्जेक्ट्स के साथ समाप्त हो जाएंगे, जिनमें से कोई भी आप स्वतंत्र रूप से बदल सकते हैं।

तो एप्पल विधि के तीन वेरिएंट लिख सकता है, या पैरामीटर अर्थ विज्ञान, जो दोनों के बदसूरत हैं नियंत्रित करने के लिए किसी प्रकार का है, तो इसके बजाय वे यह आप के लिए छोड़ दिया कोड लिखने के लिए। यदि आप चाहते हैं, तो आप इसे एनएसएआरएआरई श्रेणी विधि के रूप में जोड़ सकते हैं, बस सुनिश्चित करें कि आप अर्थपूर्ण विकल्पों को समझते हैं और इसे स्पष्ट करते हैं।

विधि:

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag 

यह एक ही मुद्दा है।

arrayWithObjects का उपयोग करते हुए क्विन का समाधान: गिनती: एक सामान्य रूप से अच्छा है, शायद सामान्य मामले के लिए आप जो भी सर्वश्रेष्ठ प्राप्त कर सकते हैं। इसे एक एनएसएआरएआरई श्रेणी में रखें और यह उतना ही अच्छा होगा जितना इसे प्राप्त होगा।

14

सघनतम कोड मैं इस के लिए लिखने के लिए कर लिया है है:

id numbers[n]; 
for (int x = 0; x < n; ++x) 
    numbers[x] = [NSNumber numberWithInt:0]; 
id array = [NSArray arrayWithObjects:numbers count:n]; 

यह काम करता है क्योंकि आप C99 जो Xcode डिफ़ॉल्ट रूप से उपयोग करता है के साथ क्रम लंबाई निर्धारित सी-सरणियों बना सकते हैं।

वे सभी एक ही मान रहे हैं, तो आप भी memset इस्तेमाल कर सकते हैं (हालांकि पूर्णांक के लिए डाली शरारती है):

id numbers[n]; 
memset(numbers, (int)[NSNumber numberWithInt:0], n); 
id array = [NSArray arrayWithObjects:numbers count:n]; 

क्या आप जानते हैं कि आप कितने वस्तुओं की जरूरत है, फिर यह कोड चाहिए काम तो , हालांकि मैं यह परीक्षण नहीं किया:

id array = [NSArray arrayWithObjects:(id[5]){[NSNumber numberWithInt:0]} count:5]; 
+0

आह, आखिरी के लिए ब्रूमास्टर धन्यवाद। –

+0

अंतिम व्यक्ति कैसे काम करता है? क्या आप एक सरणी कास्टिंग नहीं कर रहे हैं जिसमें एक तत्व है जिसमें 5 के साथ सरणी है? – bcattle

+0

यह सी का एक quirk है, आप उस एनएसएनंबर उदाहरण के लिए शुरू किए गए 5 तत्वों की सी-सरणी प्राप्त करते हैं, इस मामले में कास्ट संकलक के लिए अधिक निर्देश है, इसलिए यह सरणी के आकार को जानता है। – mxcl

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