2012-06-15 11 views
5

ऑब्जेक्टिव-सी में, कैसे कुछ करने के लिए है की तरहसंकलन समय में एनएसएआरएआरई कैसे भरें?

int array[] = {1, 2, 3, 4}; 
शुद्ध सी में

?

मुझे NSSrray को NSStrings के साथ छोटे ओवरहेड (कोड और/या रनटाइम) के साथ भरने की आवश्यकता है।

उत्तर

7

संकलन समय पर आप एक सरणी बनाना संभव नहीं है। ऐसा इसलिए है क्योंकि यह "संकलित समय स्थिर नहीं है।"

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

यदि यह सही मायने में महत्वपूर्ण है कि आप इस precompiled है, तो मुझे लगता है कि आप एक परीक्षण परियोजना बना सकते हैं, सरणी (या जो भी वस्तु) की जरूरत है, यह तो भर सकते हैं, बनाने के लिए: इसके बजाय, आप की तरह कुछ कर सकते हैं NSKeyedArchiver (जो इसे फ़ाइल में सहेज लेगा) का उपयोग करके इसे क्रमबद्ध करें, और उसके बाद उस फ़ाइल को अपने ऐप में शामिल करें। इसके बाद आपको उपयोग के लिए ऑब्जेक्ट को अनारक्षित करने के लिए NSKeyedUnarchiver का उपयोग करने की आवश्यकता होगी। मुझे यकीन नहीं है कि इन दो दृष्टिकोणों के बीच प्रदर्शन अंतर क्या है। इस विधि का एक फायदा यह है कि यदि आपके पास ऐसी सरणी को प्रारंभ करने की आवश्यकता है जिसमें बहुत सारी ऑब्जेक्ट्स शामिल हैं, तो आपके पास कोड का बड़ा ब्लॉक नहीं है।

+0

इसे प्रीकंपिल्ड करना महत्वपूर्ण नहीं है, इसलिए आपका समाधान मेरे लिए पूरी तरह से काम करता है। धन्यवाद! – MoreFamed

+0

यह हर बार 'viewDidLoad' निष्पादित करता है, सरणी बनाता है, एक' शून्य 'परीक्षण अच्छा होगा। – Cristik

-1

उपयोग इस

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

यह ध्यान देने योग्य है कि 'str1, str2 ...' कुछ स्ट्रिंग "' "जैसे एनएसएसटींग अक्षर हो सकता है, वैसे ही जैसे वे एक सी सरणी प्रारंभकर्ता के लिए होंगे। मुझे लगता है * इस तरह के तार छवि में संकलन समय में शामिल हो जाएगा। ऐसा नहीं लगता कि आप रनटाइम के अलावा खुद को सरणी में शामिल कर सकते हैं, हालांकि, कम से कम कुछ बदसूरत धारावाहिक हैक के बिना नहीं। – walkytalky

+0

यह मेरे लिए काम नहीं करता है। मैंने एनएसएआरएआरए * ए = [एनएसएआरएआरए सरणी विथ ऑब्जेक्ट्स: @ "फू", @ "बार", @ "बाज़", शून्य]; और संकलक कहता है "प्रारंभकर्ता तत्व संकलन-समय स्थिर नहीं है"। मुझे मॉड्यूल में कई रूटीन के बीच सरणी साझा करने की ज़रूरत है, इसलिए मैं चाहता हूं कि सरणी घोषित की जाए और किसी भी दिनचर्या के बाहर भर जाए ... – MoreFamed

+0

-1 जैसा कि अधिक फ़ेमड ने इंगित किया है, यह पूरी तरह से जिस तरह से आवश्यक है, वह काम नहीं करेगा। आपका कोड * काम करेगा यदि उसे केवल एक ही विधि में 'सरणी' तक पहुंचने की आवश्यकता होती है, लेकिन उसे अपनी कक्षा में इसकी पहुंच की आवश्यकता होती है। – FreeAsInBeer

-2

जहां तक ​​मैं तुम्हें समझ में एक एक आयामी सरणी, कृपया की जरूरत आप आप अधिक की जरूरत है NSArray .. के वर्ग तरीकों का उपयोग कर सकते हैं उदाहरण के

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

के लिए अपने मुद्दे के बारे में कुछ और जानकारी दें

+0

-1 आपके उत्तर में @ Sheraza के समान समस्या है। यह पूरे वर्ग में सरणी तक पहुंच प्रदान नहीं करेगा। – FreeAsInBeer

-2

सरल: NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; आधुनिक उद्देश्य सी जेनेरिक और शाब्दिक सरणी की अनुमति देता है।

यदि आप छोटे कोड चाहते हैं, तो NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];, जेनरिक वैकल्पिक हैं और केवल सरणी तत्वों तक पहुंचने में सहायता करते हैं, इस प्रकार आप कोड में बाद में templatized सरणी में डाल सकते हैं।

+1

मैं इसे स्थिर/स्थैतिक के रूप में संकलित नहीं कर सकता। – Andy

+0

हां, यह काम नहीं करेगा क्योंकि यह एक रनटाइम निष्पादित निर्माण है। – Cristik

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