2010-12-04 28 views
0

J'ai besoin de quelques exemples d'allocation de mémoire dynamique de tableau 2D dans ObjectiveC dans iPhone sdk. Un exemple de code sera apprécié. Je veux déclarer un tableau de pointeurs et ensuite chaque index déclarera un tableau à l'exécution.Allocation de mémoire dynamique 2D - ObjectiveC

Merci

+1

Parlez-vous de C arrays ou NSArrays? –

+0

NSArrays, je veux déclarer un tableau de pointeurs et chaque pointeur pointera vers un tableau. –

Répondre

4

Il est étrange de comploter tableaux C et NSArrays, mais il peut être fait:

NSMutableArray *myArrays[]; 
myArrays = malloc(sizeof(NSMutableArray *) * numberOfArrays); 

Une meilleure solution serait d'utiliser soit un NSArray de NSArrays;

NSMutableArray *rows = [NSMutableArray array]; 
[rows addObject: [NSMutableArray array]]; 
[rows addObject: [NSMutableArray array]]; 
[rows addObject: [NSMutableArray array]]; 

NSMutableArray *row0 = [rows objectAtIndex: 0]; 
[row0 addObject: [Datum new]]; 
[row0 addObject: [Datum new]]; 
[row0 addObject: [Datum new]]; 

.... etc ....

Ou, il suffit d'utiliser un tableau de pointeurs directement:

Datum **my2DArray = malloc(sizeof(Datum *) * width * height); 

Ensuite, toute cartésienne coordonnées données au sein my2DArray est un peu simple math:

my2DArray[ x + (y * width) ] = ....; 

Cela va effectivement convertir toute coordonnée donnée (x, y) en un index linéaire x (effectivement, y devient la foulée et x devient le décalage dans la foulée).

-1

Pour NSArrays, vous pouvez utiliser quelque chose comme ceci:

NSMutableArray *array2d = [[NSMutableArray alloc] init]; 
for (int i = 0; i < d1; i++) 
{ 
     NSMutableArray *innerArray = [NSMutableArray array]; 
     [array2D addObject:innerArray]; 

     for (int j = 0; j < d2; j++) 
     { 
      [innerArray addObject:myDynamicData]; 
     } 
} 

Si vous voulez dire quelque chose d'autre par des données dynamiques, alors s'il vous plaît modifier l'OP expliquer exactement ce que vous voulez dire. Umm bien sûr C a une allocation de mémoire dynamique.

+2

* "Tous les tableaux doivent avoir une taille spécifiée à la compilation." * - C99 a des VLA, GCC les a déjà supportés comme une extension beaucoup plus longue. En outre, vous pouvez avoir des "tableaux dynamiques" *, c'est-à-dire des segments alloués par tas. –

+0

Votre boucle interne ne doit pas non plus ajouter d'objets à 'array2d', mais le tableau nouvellement ajouté. –

+0

Au lieu de [[[NSMutableArray alloc] init] autorelease], utilisez la méthode pratique [tableau NSMutableArray]. Plus court et plus concis. – zaph

0

Regardez malloc et realloc. Avec cela, vous pouvez allouer de la mémoire et redimensionner plus tard si nécessaire, il vous suffit de garder une trace de toute votre utilisation de la mémoire et n'oubliez pas de free() lorsque vous avez terminé.