Question

Je travaille sur une application iPhone en utilisant l'objectif C. J'ai la classe A, ce qui crée un pointeur NSMutableArray appelé « liste ». Mais, en classe A, je ne crée un objet pour qu'il pointer. Au lieu de cela, j'appelle une méthode de classe en classe B, pour obtenir des données à partir d'une base de données SQLite, et remplir un objet NSMutableArray là. Je veux être en mesure de mettre le pointeur en classe A au point à l'objet NSMutableArray créé dans la méthode de classe B en la faisant passer comme argument à la méthode. Je ne peux pas le faire en retournant le tableau parce que je veux retourner le résultat SQLite.

Je me demande si je fais ce droit? Je ne l'ai pas écrit toute méthode encore (quand il est fait, ce sera assez long), mais je veux savoir si je fais les choses de pointeur correctement avant que je commence sur 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 bien compris? Ou suis-je pas comprendre quelque chose? Je suppose que ce genre de choses pointeur à pointeur ne cliquez simplement pas encore avec moi. Après avoir lu quelques sources générales sur les pointeurs, je soupçonne que c'est comment 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 à pointeur) .

Était-ce utile?

La solution

Pointeurs à pointeurs sont un peu escheric, oui. La façon simple de le faire serait de créer un tableau vide dans A et passer un pointeur de réseau régulier B qui vient remplir. Si vous insistez sur la création du tableau dans B, je pense que vous pouvez faire ceci:

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

Autres conseils

Modification des pointeurs vers des objets comme celui-ci est assez rare en Objective-C. Le temps principal, nous voyons des choses comme cela est quand une méthode a un risque de défaillance, à quel point nous allons passer un pointeur à une référence de NSError. Par exemple, le NSFileManager de - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

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

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top