web-dev-qa-db-fra.com

Initialiser un tableau d'objets à l'aide de NSArray

Objective-C et iOS étant relativement nouveaux pour moi, je joue avec l'affichage Picker View. J'ai défini une classe de personnes de sorte que, lorsque vous créez une nouvelle personne, elle lui soit automatiquement attribuée par son nom et son âge.

#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

Maintenant, je veux faire un éventail de personnes afin que je puisse jeter un tas dans le sélecteur, choisir une personne et montrer son âge. Tout d’abord, j’ai besoin de faire un tableau de personnes. Comment créer un tableau d'objets, les initialiser et les allouer?

37
Howdy_McGee
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

vous pouvez également y accéder sans utiliser NSMutableArray:

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

Une dernière chose - il est valable pour un environnement activé par ARC, si vous voulez l’utiliser sans ARC, n'oubliez pas d’ajouter des objets autoreleased dans un tableau!

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

Il y a aussi un raccourci pour le faire:

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

C'est équivalent à

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

Comme iiFreeman l'a dit, vous devez toujours gérer correctement la mémoire si vous n'utilisez pas ARC.

70
Allen Zeng

Personne ne commente la méthode randomAge?

C'est tellement mauvais, ça ne pourrait pas être un tort.

NSInteger est un type primitif - il est très probablement typé comme int ou long. Dans la méthode randomAge, vous calculez un nombre d'environ 1 à 98.

Ensuite, vous pouvez convertir ce nombre en un NSNumber . Vous deviez ajouter un casting parce que le compilateur vous a donné un avertissement que vous n'avez pas compris. Cela a fait disparaître l'avertissement, mais vous a laissé un terrible bug: Ce nombre a été forcé d'être un pointeur. Vous avez donc maintenant un pointeur sur un entier quelque part dans les 100 premiers octets de la mémoire.

Si vous accédez à un NSInteger par le pointeur, votre programme se bloquera. Si vous écrivez via le pointeur, votre programme se bloquera. Si vous le mettez dans un tableau ou un dictionnaire, votre programme va planter.

Changez-le soit en NSInteger ou int, ce qui est probablement le meilleur, soit en NSNumber si vous avez besoin d'un objet pour une raison quelconque. Créez ensuite l'objet en appelant ([NSNumber numberWithInteger: 99] ou le numéro de votre choix.

9
gnasher729

Cela pourrait ne pas vraiment répondre à la question, mais juste au cas où quelqu'un aurait simplement besoin de envoyer rapidement une valeur de chaîne à une fonction qui nécessite un paramètre NSArray.

NSArray *data = @[@"The String Value"];

si vous avez besoin d’envoyer plus d’une valeur de chaîne, vous pouvez également utiliser

NSArray *data = @[@"The String Value", @"Second String", @"Third etc"];

alors vous pouvez l'envoyer à la fonction comme ci-dessous

theFunction(data);
0
JaKK's Team