2013-02-20 10 views
30

Sono abbastanza nuovo per Objective-C e iOS, quindi ho giocato con la Vista di selezione. Ho definito una classe di persone in modo tale che quando crei una nuova persona essa dia automaticamente a tale persona un nome e l'età.Inizializza matrice di oggetti utilizzando 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 

Ora voglio fare una serie di persone in modo da poter generare un mazzo nel selettore, scegliere una persona e mostrare la loro età. Prima però ho bisogno di creare una serie di Persone. Come posso creare una matrice di oggetti, inizializzarli e allocarli?

+3

Ero a metà strada a rispondere quando iiFreeman mi ha battuto con la risposta corretta. Tuttavia, trovo che il nome nel tuo nomeArr sia fantastico: D – Bergasms

risposta

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 

inoltre è possibile raggiungere questo senza usare NSMutableArray:

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

Una cosa di più - è valido per ARC abilitato ambiente, se hai intenzione di usarlo senza ARC non dimenticate di aggiungere oggetti autoreleased in serie!

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

Per quello secondo sarebbe più efficiente e più diretto solo creare l'array mutabile e crearne una copia, vs creare N array di nuove persone. –

+1

È meglio usare '[persone copia]' invece di 'arrayWithArray:' IMO. (Oh, vedo che il commento sopra è lo stesso ... scusa) – borrrden

66

C'è anche una scorciatoia di fare questo:

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

E 'equivalente a

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

Come ha detto iiFreeman, è ancora necessario fare la gestione della memoria corretta se non sei usando ARC.

+0

Ho provato questo, ma continuo a ricevere un errore di 'identificatore non dichiarato' su person1,2,3 ecc. –

+1

Gli oggetti person1, 2 e 3 sono dichiarati ovunque? –

9

Nessuno commenta il metodo randomAge?

Questo è così terribilmente sbagliato, non potrebbe essere più sbagliato.

NSInteger è un tipo primitivo - è molto probabilmente digitato come int o long. Nel metodo randomAge, si calcola un numero da 1 a 98 circa.

Quindi si esegue il cast di tale numero su un NSNumber *. Dovevi aggiungere un cast perché il compilatore ti dava un avvertimento che non capivi. Questo ha fatto sparire l'avvertimento, ma ti ha lasciato un bug terribile: quel numero è stato forzato ad essere un puntatore, quindi ora hai un puntatore a un intero da qualche parte nei primi 100 byte di memoria.

Se si accede a NSInteger tramite il puntatore, il programma si arresta in modo anomalo. Se scrivi attraverso il puntatore, il tuo programma andrà in crash. Se lo metti in un array o un dizionario, il tuo programma andrà in crash.

Cambiarlo in NSInteger o in int, che è probabilmente il migliore, o in NSNumber se è necessario un oggetto per qualche motivo. Quindi creare l'oggetto chiamando [NSNumber numberWithInteger: 99] o il numero desiderato.

-1

Come creare NSArray, NSMutableArray .... ??

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

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