2013-02-20 28 views
30

का उपयोग कर ऑब्जेक्ट्स के ऐरे को प्रारंभ करें मैं उद्देश्य-सी और आईओएस के लिए काफी नया हूं इसलिए मैं पिकर व्यू के साथ खेल रहा हूं। मैंने एक व्यक्ति वर्ग परिभाषित किया है ताकि जब आप एक नया व्यक्ति बनाते हैं तो यह स्वचालित रूप से उस व्यक्ति को नाम और उम्र देता है।NSArray

#import "Person.h" 

@implementation Person 

@synthesize personName, age; 

-(id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
     personName = [self randomName]; 
     age = [self randomAge]; 
    } 

    return self; 
} 

-(NSString *) randomName 
{ 
    NSString* name; 
    NSArray* nameArr = [NSArray arrayWithObjects: @"Jill Valentine", @"Peter Griffin", @"Meg Griffin", @"Jack Lolwut", 
          @"Mike Roflcoptor", @"Cindy Woods", @"Jessica Windmill", @"Alexander The Great", 
          @"Sarah Peterson", @"Scott Scottland", @"Geoff Fanta", @"Amanda Pope", @"Michael Meyers", 
          @"Richard Biggus", @"Montey Python", @"Mike Wut", @"Fake Person", @"Chair", 
          nil]; 
    NSUInteger randomIndex = arc4random() % [nameArr count]; 
    name = [nameArr objectAtIndex: randomIndex]; 
    return name; 
} 

-(NSInteger *) randomAge 
{ 
    //lowerBound + arc4random() % (upperBound - lowerBound); 
    NSInteger* num = (NSInteger*)(1 + arc4random() % (99 - 1)); 

    return num; 
} 

@end 

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

+3

मैं जवाब देने के माध्यम से आधा रास्ते था जब iiFreeman ने मुझे सही उत्तर के साथ मार दिया। हालांकि, मुझे आपके नाम का पहला नाम अद्भुत लगता है: डी – Bergasms

उत्तर

38
NSMutableArray *persons = [NSMutableArray array]; 
for (int i = 0; i < myPersonsCount; i++) { 
    [persons addObject:[[Person alloc] init]]; 
} 
NSArray *arrayOfPersons = [NSArray arrayWithArray:persons]; // if you want immutable array 

भी आप का उपयोग किए बिना NSMutableArray इस तक पहुँच सकते हैं:

NSArray *persons = [NSArray array]; 
for (int i = 0; i < myPersonsCount; i++) { 
    persons = [persons arrayByAddingObject:[[Person alloc] init]]; 
} 

एक और बात - यह एआरसी सक्षम वातावरण के लिए मान्य है, यदि आप एआरसी के बिना इसका इस्तेमाल करने के लिए जा autoreleased वस्तुओं को जोड़ने के लिए भूल नहीं है सरणी में!

[persons addObject:[[[Person alloc] init] autorelease]; 
+2

उस दूसरे के लिए यह अधिक सक्षम और अधिक सीधे और आगे बढ़ने योग्य सरणी बनाने के लिए और इसके प्रतिलिपि बनाने के लिए, नए बनाम एनरे बनाम बनायेगा। –

+1

'arrayWithArray:' IMO के बजाय '[व्यक्तियों की प्रतिलिपि] 'का उपयोग करने के लिए यह बेहतर रूप है। (ओह, मुझे लगता है कि उपर्युक्त टिप्पणी वही है ... माफ करना) – borrrden

66

वहाँ भी ऐसा करने का एक आशुलिपि है:

NSArray *persons = @[person1, person2, person3]; 

यह

NSArray *persons = [NSArray arrayWithObjects:person1, person2, person3, nil]; 

रूप iiFreeman कहा के बराबर है, तो आप अभी भी उचित स्मृति प्रबंधन करने के लिए यदि आप नहीं कर रहे हैं की जरूरत है एआरसी का उपयोग करना

+0

मैंने कोशिश की लेकिन मुझे व्यक्ति '1,3,3 आदि पर' अविकसित पहचानकर्ता 'त्रुटि मिल रही है। –

+1

ऑब्जेक्ट्स व्यक्ति 1, 2 और 3 कहीं भी घोषित किए गए हैं? –

9

कोई भी यादृच्छिक एज विधि पर टिप्पणी नहीं कर रहा है?

यह बहुत गलत है, यह कोई गलत नहीं हो सकता है।

एनएसआईएनटेगर एक आदिम प्रकार है - यह संभवतः int या long के रूप में टाइप किया गया है। यादृच्छिक एज विधि में, आप लगभग 1 से 98 तक की संख्या की गणना करते हैं।

फिर आपने उस नंबर को NSNumber * पर डाला। आपको एक कलाकार जोड़ना पड़ा क्योंकि संकलक ने आपको एक चेतावनी दी थी जिसे आप समझ में नहीं आया था। इसने चेतावनी को दूर कर दिया, लेकिन आपको एक भयानक बग के साथ छोड़ दिया: उस नंबर को पॉइंटर होने के लिए मजबूर किया गया था, इसलिए अब आपके पास स्मृति के पहले 100 बाइट्स में कहीं पूर्णांक के लिए पॉइंटर है।

यदि आप पॉइंटर के माध्यम से एनएसआईएनटेगर तक पहुंचते हैं, तो आपका प्रोग्राम क्रैश हो जाएगा। यदि आप सूचक के माध्यम से लिखते हैं, तो आपका प्रोग्राम क्रैश हो जाएगा। यदि आप इसे सरणी या शब्दकोश में डालते हैं, तो आपका प्रोग्राम क्रैश हो जाएगा।

इसे या तो एनएसआईएनटेगर या इंट में बदलें, जो संभवतः सबसे अच्छा है, या NSNumber के लिए यदि आपको किसी कारण से ऑब्जेक्ट की आवश्यकता है। फिर [NSNumber numberWithInteger: 99] या जो भी संख्या आप चाहते हैं उसे कॉल करके ऑब्जेक्ट बनाएं।

-1

एनएसएआरएआरई, एनएसएमयूटेबलएरे कैसे बनाएं .... ??

NSArray keys =[NSArray arrayWithObjects:@"key1",@"key2",@"key3",nil]; 

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil];