Inicializar matriz de objects con NSArray

Soy bastante nuevo en Objective-C e iOS, así que he estado jugando con Viewer Picker. He definido una class de persona para que cuando crea una nueva persona le dé automáticamente a esa persona un nombre y una edad.

#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 

Ahora quiero hacer una variedad de Personas para que pueda arrojar un montón al selector, elegir una Persona y mostrar su edad. Primero aunque necesito hacer una variedad de personas. ¿Cómo hago una matriz de objects, los inicializo y los asigno?

 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 

También puede llegar a esto sin usar NSMutableArray:

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

Una cosa más: es válido para entornos habilitados para ARC, si va a usarlo sin ARC, ¡no olvide agregar objects autoelegidos en array!

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

También hay una abreviatura de hacer esto:

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

Es equivalente a

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

Como dijo iiFreeman, aún necesita hacer una administración de memory adecuada si no está usando ARC.

¿Nadie comentando el método randomAge?

Esto es terriblemente incorrecto, no podría ser un error.

NSInteger es un tipo primitivo, lo más probable es typedef'd como int o long. En el método randomAge, calcula un número de aproximadamente 1 a 98.

A continuación, lanza ese número a un NSNumber *. Tenías que agregar un yeso porque el comstackdor te dio una advertencia que no comprendiste. Eso hizo que la advertencia desapareciera, pero te dejó con un error horrible: ese número se vio forzado a ser un puntero, así que ahora tienes un puntero a un integer en algún lugar de los primeros 100 bytes de memory.

Si accede a un NSInteger a través del puntero, su progtwig se bloqueará. Si escribe a través del puntero, su progtwig se bloqueará. Si lo coloca en una matriz o dictionary, su progtwig se bloqueará.

Cámbialo por NSInteger o int, que es probablemente el mejor, o por NSNumber si necesitas un object por alguna razón. Luego, cree el object llamando a [NSNumber numberWithInteger: 99] o al número que desee.

Cómo crear NSArray, NSMutableArray ….?

 NSArray keys =[NSArray arrayWithObjects:@"key1",@"key2",@"key3",nil]; NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil];