Frage

Ich arbeite an einer iPhone -App mit objektivem C. Ich habe Klasse A, was einen nsmutablearray -Zeiger namens "Liste" erstellt. Aber in Klasse A erstelle ich nie ein Objekt, auf das es hinweist. Stattdessen rufe ich eine Klassenmethode in Klasse B auf, um einige Daten aus einer SQLite -Datenbank zu erhalten und dort ein NSMutablearray -Objekt zu füllen. Ich möchte in der Lage sein, den Zeiger in der Klasse A auf das in der Klasse B -Methode erstellte NSMutablearray -Objekt zu verweisen, indem ich ihn als Argument an die Methode übergeben kann. Ich kann es nicht tun, indem ich das Array zurückgibt, weil ich das SQLite -Ergebnis zurückgeben möchte.

Ich frage mich, ob ich das richtig mache. Ich habe die gesamte Methode noch nicht geschrieben (wenn es fertig ist, wird es ziemlich lang sein), aber ich möchte wissen, ob ich das Zeiger -Zeug richtig mache, bevor ich mit dem Rest anfange.

//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;
}

Habe ich es richtig gemacht? Oder verstehe ich nichts? Ich denke, dieses Zeiger auf Zeiger klickt noch nicht mit mir. Nachdem ich ein paar allgemeine Quellen über Zeiger gelesen habe, vermute ich, dass ich es so tun würde, aber ein Teil von mir versteht nicht, warum das AR-Argument nicht nur ein regulärer Zeiger sein kann (im Gegensatz zu einem Zeiger-auf-Zeiger). .

War es hilfreich?

Lösung

Zeiger auf Zeiger sind ein bisschen echerisch, ja. Die einfache Möglichkeit wäre, ein leeres Array in A zu erstellen und einen regulären Array -Zeiger an B zu übergeben, der es einfach füllen würde. Wenn Sie darauf bestanden hätten, das Array in B zu erstellen, könnten Sie dies tun:

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

Andere Tipps

Das Ändern von Zeigern in solche Objekte ist in Objective-C ziemlich ungewöhnlich. Die wichtigste Zeit, in der wir solche Dinge sehen, ist, wenn eine Methode ein Versagenspotential hat. Zu diesem Zeitpunkt werden wir einen Zeiger an einen weitergeben NSError Hinweis. Zum Beispiel, NSFileManager's - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

Der weitaus häufigere Weg, dies zu tun, wäre, dass die Methode das Array zurückgibt:

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top