2009-07-13 5 views
1

J'ai un tableau C bidimensionnel d'objets Objective-C. Comment accéder aux membres de ces objets?Comment utiliser un tableau C bidimensionnel d'objets Objective-C?

id array[5][5]; 
array[0][0] = [[Ball alloc] init]; 

La classe Ball a deux membres:

int size; 
CGPoint point; 

Comment puis-je accéder à la taille de l'objet Ball stocké dans le tableau [0] [0]? S'il te plaît, dis-moi comment je peux faire ça.

Merci d'avance!

Répondre

3

Selon le temps d'exécution (32 bits ou 64 bits) et si vous déclarez les variables d'instance (size et point) explicitement ou les ont synthétisés par le moteur d'exécution, vous pourrez peut-être y accéder directement à array[0][0]->size. Ce n'est pas une bonne idée cependant. Il va casser sur les temps d'exécution modernes et est très loin de la méthode Objective-C et rompt l'encapsulation en exposant publiquement les détails d'implémentation de la classe.

En Objective-C 2.0, la pratique correcte consiste à déclarer une propriété pour chaque attribut que vous souhaitez être puclically visible. Ajouter ce qui suit à la déclaration de @interfaceBall:

@property (assign) int size; 
@property (assign) CGPoint point; 

Et dans le bloc @implementation de Ball:

@synthesize size; 
@synthesize point; 

Vous pouvez maintenant accéder à la taille comme ((Ball*)array[0][0]).size. La conversion est requise pour que le compilateur reconnaisse la notation par points en tant qu'accès à une propriété. Il n'est pas obligatoire si vous utilisez les méthodes accesseur (générées automatiquement par @synthesize): [array[0][0] size].

2

Bien que cela ne soit pas complètement pertinent pour votre question (et peut-être que vous n'utilisez qu'un exemple simplifié), pourquoi ne pas utiliser des structures d'utilisation au lieu d'objets dans ce cas? Comme la taille et le point ne sont pas des objets, cela pourrait avoir plus de sens.

1

Vous pouvez le faire comme ceci:

@interface Moo : NSObject { 
@public 
    int age; 
} 

Et vous pouvez le faire sans crier gare:

Moo *m = [[Moo alloc] init]; 
m->age = 16; 
Moo *arr[4]; 
arr[0] = m; 
printf("Age: %d",arr[0]->age); 

Vous pouvez aussi faire un peu de casting:

id arr[4]; 
arr[0] = m; 
printf("Age: %d",((Moo *)arr[0])->age); 

Cela devrait travailler avec n'importe quel nombre de dimensions de tableaux! J'espère que cela aide.

+0

L'exposition publique de variables d'instance n'est PAS un bon moyen d'accomplir cela en Objective-C. Cela fait du code fragile. Je suggère la solution de Barry ci-dessus. –

+4

Tout ce qu'il a demandé était de savoir comment le faire. – micmoo