2010-05-06 23 views
30

मैं स्ट्रिंग अक्षर के समूह के साथ एक एनएसएआरएआरई बनाने का प्रयास कर रहा हूं, हालांकि मुझे संकलन त्रुटि मिलती है "प्रारंभकर्ता तत्व निरंतर नहीं है"।स्ट्रिंग अक्षर के साथ मैं एनएसएआरएआरई कैसे बना सकता हूं?

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil]; 

क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं, और संभवतः त्रुटि संदेश समझा सकता हूं?

+0

आपका कोड काम करना चाहिए, क्या आप वाकई त्रुटि कहीं और नहीं हैं? – pheelicks

+0

आपको यह कहना चाहिए कि आपने कहां रखा है क्योंकि ऐसा लगता है जैसे आपने इसे किसी विधि में नहीं रखा है। – malhal

उत्तर

18

यह एनएसएआरएआरई सृजन के साथ कोई समस्या नहीं है (यदि आप [NSArray array] इसके बजाय लिखा है तो आपको वही त्रुटि मिल जाएगी), लेकिन जहां आपने इसे लिखा है। मुझे लगता है कि यह एक वैश्विक या फ़ाइल-स्थैतिक एनएसएआरएआरई है। सी में, उस तरह के चर के पास निरंतर प्रारंभकर्ता होना चाहिए - जिसका अर्थ है फ़ंक्शन कॉल नहीं (या, विस्तार से, एक विधि कॉल)। समाधान सरणी की वास्तविक सृजन और असाइनमेंट को उस विधि में रखना है जिसे आपको सरणी की आवश्यकता होने से पहले कहा जाएगा, जैसे कि initialize

+1

मैंने इसे हेडर फ़ाइल में घोषित कर दिया था, लेकिन मुझे पता नहीं था कि मैं इसे किसी विधि के बाहर शुरू नहीं कर सका। – Kyle

+0

इसे 'लोड' के अंदर रखना सुरक्षित होगा? – user102008

0

उस कोड के साथ कुछ भी गलत नहीं है। क्या आप वाकई उस लाइन पर त्रुटि उत्पन्न कर रहे हैं?

2

मैं उद्देश्य सी में एक नौसिखिया हूँ, लेकिन मुझे लगता है कि सही कोड है:

NSArray * मुद्राओं = [[NSArray alloc] initWithObjects: @ "डॉलर" @ "यूरो", @ "पाउंड", शून्य];

मुझे यकीन नहीं है कि।

+2

यह भी मान्य है, हालांकि ओपी के कोड में कुछ भी गलत नहीं है। आपकी विधि केवल सरणी को बरकरार रखती है जबकि उसका – pheelicks

+0

नहीं है, हालांकि, यदि स्थिर चर में संग्रहीत ऑब्जेक्ट ** ** ** बनाए रखा गया है, तो यह एक गुप्त क्रैशर बग है, इसलिए आवंटन/init करना सही काम होगा। – jlehr

7

ऐसा लगता है जैसे चक ने समस्या देखी है। एक चीज जिसे आप जानना चाहते हैं कि आपके समाधान को कोडिंग में यह है कि आप स्थिर वैरिएबल में एनएसएआरएआरई के एक ऑटोरेलेज्ड इंस्टेंस को संग्रहित करना चाहते हैं। इसके अलावा, इन स्थितियों के लिए एक आम पैटर्न एक वर्ग विधि है कि बनाता है और इसलिए की तरह स्थिर चर में संग्रहीत मूल्य, रिटर्न लिखने के लिए है:

+ (NSArray *)currencies 
{ 
    static NSArray *_currencies; 

    // This will only be true the first time the method is called... 
    // 
    if (_currencies == nil) 
    { 
     _currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil]; 
    } 

    return _currencies; 
} 
+0

हाय, स्थैतिक चर में ऑटोरेलेज्ड ऑब्जेक्ट्स को स्टोर करने की अनुशंसा क्यों नहीं की जाती है? क्या यह दक्षता के लिए है ताकि उन्हें हर लूप पर उनकी बरकरार रखने के लिए नहीं कहा जा सके? –

+1

एक ऑटोरेलीज पूल में ऑब्जेक्ट्स को उनकी बरकरार गिनती के लिए नहीं पूछा जाता है; ऑटोरेलीज पूल जारी होने पर उन्हें 'रिलीज' संदेश भेजा जाता है।यदि एक ऑटोरेलेज्ड ऑब्जेक्ट स्थिर वैरिएबल में संग्रहीत किया जाता है, तो ऐसा होने के बाद चर में एक अमान्य पता होगा, और इसका संदर्भ देने का प्रयास या तो आपके प्रोग्राम को क्रैश करेगा, या इससे भी बदतर, क्योंकि यह उस पर आवंटित कुछ नई ऑब्जेक्ट को गलत तरीके से एक्सेस करने का कारण बनता है अंतरिम में पता। – jlehr

+0

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

3

हालांकि यह पुराना है, नोटिस कृपया है कि एप्पल के लिए एक नया पैच के लिए प्रतिबद्ध llvm प्रोजेक्ट NSArray, NSDictionary और NSNumber के लिए नए उद्देश्य-सी शाब्दिक वाक्यविन्यास के लिए समर्थन जोड़ रहा है।

देखें here और here

67

इस जादू का प्रयास करें:

NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"]; 

और हाँ यह एक तरीका है अंदर होना चाहिए।

+0

यह ध्यान देने योग्य है कि यह विधि के अंदर होने पर गतिशील रूप से आवंटित सरणी होने जा रहा है। मुझे उम्मीद है कि यह स्थिर स्थिर सरणी के रूप में होगा। – Andy

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