Question

Comment déclariez-vous, définir les propriétés, synthétisent, et mettre en œuvre un tableau int de taille 5 en Objective C? Je vous écris ce code pour une application iPhone. Merci.

Était-ce utile?

La solution

Je pense que la chose « Cocoa-y » faire est cacher le tableau int, même si vous l'utilisez en interne. Quelque chose comme:

@interface Lottery : NSObject {
    int numbers[5];
}

- (int)numberAtIndex:(int)index;
- (void)setNumber:(int)number atIndex:(int)index;
@end

@implementation Lottery

- (int)numberAtIndex:(int)index {
    if (index > 4)
        [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise];
    return numbers[index];
}

- (void)setNumber:(int)number atIndex:(int)index {
    if (index > 4)
        [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise];
    numbers[index] = number;
}

Autres conseils

Voici quelque chose à essayer. Dans le fichier .h:

@property int* myIntArray;

Ensuite, dans le fichier .m:

@synthesize myIntArray;

Si vous utilisez @synthesize, vous aurez besoin de malloc / calloc le tableau vous, probablement au cours de init ().

Vous pouvez écrire vos propres fonctions accesseurs et les ont malloc / calloc si elle est appelée avant le tableau a été alloué.

De toute façon, vous aurez envie de libérer le tableau dans la méthode dealloc ().

Ceci est probablement naïf et mal, comme je suis juste montée en puissance sur l'objectif C moi-même, mais jusqu'à présent, il semble fonctionner pour moi.

Vous ne devriez pas utiliser int dans ce cas si vous souhaitez utiliser un tableau. Utilisez NSNumber et mettre ces 5 NSNumbers dans un NSMutableArray.

@interface testClass: NSObject {
     NSMutableArray* numbers;
}
@property (nonatomic, retain) NSMutableArray* numbers;
-(id)initWithValue:(NSNumber *)initialValue;
@end


@implementation testClass
@synthesize numbers;
-(id)initWithValue:(NSNumber *)initialValue {
     numbers = [[NSMutableArray alloc] initWithCapacity:5];
     [numbers addObject:initialValue];
     return self;
 }
@end

Le code pour l'interface et la mise en œuvre avec synthétisent (non testé BTW). Qu'est-ce que vous essayez d'accomplir?

bonne intro rapide

J'ai une variable de classe:

NSInteger myInt[5];

Alors que je pouvais utiliser la myInt normale [1] = 0 syntaxe dans mon code, je crée une propriété qui renvoie un pointeur entier:

@property (nonatomic, readonly) NSInteger *myInt;

Ensuite créé la méthode getter suivante:

-(NSInteger *) myInt {
  return myInt
}

Maintenant, je peux utiliser quelque chose comme class.myInt [1] = 0;

Eh bien, je ne sais pas sûr que cela fonctionne, mais il semble. Je pensais juste que je mettrais ce là si quelqu'un d'autre veut l'essayer.

Quoi que vous fassiez, vous devez être conscient des conséquences.

Un tableau d'entiers est pas référence compté. Vous ne savez pas combien de personnes y accéder. Vous ne savez pas qui devrait désaffecter et quand. Ainsi, vous pouvez facilement avoir une propriété de type int *. Le compositeur prendra un pointeur et le stocker dans la variable d'instance. Le getter retourne le contenu de la variable d'instance. Il fonctionne.

Cependant, vous ne savez pas quand le tableau doit être attribué ou désallouée. Si vous avez des tableaux statiques (par exemple quatre tableaux différents contenant des nombres), aucun problème. Mais si vous créez un tableau d'entiers avec malloc (), quelqu'un doit libérer (le). Alors, quand cela va se passer?

Parce que d'avoir à gérer la durée de vie d'un tableau est de la foutaise, je recommande que vous soit juste utiliser un NSArray de NSNumber, ou vous regardez manuellement NSPointerArray qui peut être abusé à des réseaux de magasins d'entiers avec comptage de référence, ou vous créer votre propre classe comme la classe de loterie dans une réponse précédente, juste un peu plus souple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top