2012-10-15 2 views
0

je me quelques précisions sur les variables d'initialisation en Objective CObjectif C quand Alloc et Init Clarification

ai Je dis une méthode qui retourne un tableau.

-(NSMutableArray *) getArray 
{ 
    NSMutableArray *arr = [[NSMutableArray alloc]init]; //line A 

for(int i = 0; i < 10; i++) 
{ 
    [arr addObject:@"word"]; 
} 

return arr; 
} 

Puis j'appelle cette méthode.

NSMutableArray *myArray = [[NSMutableArray alloc]init]; //line B 
       myArray = [self getArray]; 

Alors dois-je allouer de la mémoire dans les deux lignes A et B, ni, ou en seulement ou juste B? L'alternative étant simplement

NSMutableArray *arr;  //replacing line A 
NSMutableArray *myArray; //replacing line B 
+0

Vous devez décider (et spécifier) ​​si vous utilisez ARC ou non. –

+0

J'utilise ARC. –

+0

Vous devez également comprendre plus clairement la différence entre déclarer un pointeur/référence et allouer un objet. Vous semblez être confus là. –

Répondre

1

Pour tout tableau, vous devez allouer sa mémoire et l'initialiser une seule fois. Pour commencer, cela signifie que votre alternative à la fin ne fonctionne pas. Il déclare que ces deux variables existent et pointera vers des tableaux mais ne fait rien pour les créer et les assigner.

La ligne B crée et initialise un tableau très bien, mais perd immédiatement sa seule référence en affectant le résultat de getArray à la même variable. Si vous utilisez la gestion de la mémoire ARC, c'est un peu inutile; sans ARC, c'est une fuite de mémoire.

La ligne A crée et initialise également un tableau correctement et, dans la mesure où le code que vous avez publié, est celui qui est affecté par ce que vous faites à côté de myArray.

(Rappelez-vous que les choses que vous déclarez en tant que variables - comme NSMutableArray *arr - peuvent être considérés comme noms pour les objets réels plutôt que objets eux-mêmes.)

1

Vous devez allouer de la mémoire en A, mais B. Le alloc/init dans A crée l'objet que la variable arr est en faisant référence à. Vous passez cet objet en tant que valeur de retour de la méthode getArray. Dans B, vous voulez simplement que myArray fasse référence à l'objet retourné, vous ne voulez pas avoir un nouvel objet. Si vous faites:

NSMutableArray *myArray = [[NSMutableArray alloc]init]; //line B 
       myArray = [self getArray]; 

La première ligne crée un nouvel objet et l'affecte à myArray. La seconde ligne remplace immédiatement cette valeur de myArray par un autre objet renvoyé par la méthode. Sans ARC (comptage automatique des références), cela entraînera une fuite de mémoire de l'objet créé dans la première ligne.