2011-01-08 4 views
2

Je travaille sur une application iPhone en utilisant l'objectif C. J'ai la classe A, qui crée un pointeur NSMutableArray appelé "liste". Mais, en classe A, je ne crée jamais un objet pour qu'il pointe vers. Au lieu de cela, j'appelle une méthode de classe dans la classe B, pour obtenir des données d'une base de données sqlite, et y remplir un objet NSMutableArray. Je veux être en mesure de définir le pointeur dans la classe A pour pointer vers l'objet NSMutableArray créé dans la méthode de classe B en le passant en tant qu'argument à la méthode. Je ne peux pas le faire en retournant le tableau parce que je veux retourner le résultat sqlite.Comment utiliser une méthode pour changer un pointeur?

Je me demande si je fais ça correctement? Je n'ai pas encore écrit toute la méthode (quand ça sera fait, ça sera assez long), mais je veux savoir si je fais correctement le pointeur avant de commencer le reste.

//ClassA.m 

//... 
NSMutableArray *list; 
[ClassB populateArrayFromSqlite:&list]; 
//Now do stuff with "list", which should point to the array created in populateArrayFromSqlite 
//... 

//ClassB.m 
+(int)populateArrayFromSqlite:(NSMutableArray**)ar { 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    //Here there will be code that populates the array using sqlite (once I write it) 
    //And then I need to set the "list" pointer in ClassA.m to point to this array 
    ar = &array; //Is this how? 

    return resultFromSqlite; 
} 

Ai-je fait les choses correctement? Ou est-ce que je ne comprends pas quelque chose? Je suppose que ce truc de pointeur à point ne clique pas encore avec moi. Après avoir lu quelques sources générales sur les pointeurs, je pense que c'est comme ça que je le ferais mais une partie de moi ne comprend pas pourquoi l'argument ar ne peut pas être juste un pointeur régulier (par opposition à un pointeur vers un pointeur) .

Répondre

6

Les pointeurs vers les pointeurs sont un peu escheriques, oui. Le moyen simple de le faire serait de créer un tableau vide dans A et de passer un pointeur de tableau régulier à B qui le remplirait simplement. Si vous insistez sur la création du tableau dans B, je pense que vous pouvez le faire:

- (void) createArray: (NSMutableArray**) newArray 
{ 
    NSAssert(newArray, @"I need a pointer, sweetheart."); 
    *newArray = [[NSMutableArray alloc] init]; 
    [*newArray addObject:...]; 
} 
+1

+1 bien qu'il serait préférable de vérifier si '(newArray = de zéro!)', Tellement vous ne dérérez pas accidentellement un pointeur nul. :) –

+0

Droite. J'ai mentionné cette possibilité juste pour répondre à la question pointeur-à-pointeur, dans la pratique j'utiliserais certainement la solution plus simple que j'ai mentionnée en premier. Je vais ajouter une affirmation pour clarifier les choses. – zoul

+0

Merci, je n'ai même pas pensé à créer l'objet d'abord dans la classe A et à lui passer un pointeur vers la méthode de la classe B. Aussi, avec votre exemple, je pense que je comprends cela. Passer l'adresse d'un pointeur dans l'argument newArray envoie en réalité une copie d'un pointeur au pointeur, et en le déréférenciant, vous obtenez le pointeur lui-même, auquel vous pouvez ensuite assigner une nouvelle adresse, correct? – Adam

2

Changing des pointeurs vers des objets comme celui-ci est assez rare en Objective-C. L'heure principale où nous voyons des choses comme ceci est quand une méthode a un potentiel d'échec, à quel point nous passerons un pointeur vers une référence NSError. Par exemple, NSFileManager- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

La façon beaucoup plus courante de le faire serait d'avoir la méthode retourne le tableau:

NSMutableArray * list = [ClassB mutableArrayFromSQLite]; 
Questions connexes