2011-01-08 7 views
2

Ich arbeite an einer iPhone-App mit Ziel C. Ich habe Klasse A, die einen NSMutableArray-Zeiger namens "Liste" erstellt. Aber in Klasse A erstelle ich niemals ein Objekt, auf das es zeigen kann. Stattdessen rufe ich eine Klassenmethode in Klasse B auf, um einige Daten aus einer SQLite-Datenbank abzurufen und ein NSMutableArray-Objekt dort aufzufüllen. Ich möchte in der Lage sein, den Zeiger in der Klasse A auf das NSMutableArray-Objekt zu setzen, das in der Methode der Klasse B erstellt wurde, indem ich es als Argument an die Methode übergebe. Ich kann es nicht tun, indem ich das Array zurückgebe, weil ich das SQLite-Ergebnis zurückgeben möchte.Wie verwende ich eine Methode, um einen Zeiger zu ändern?

Ich frage mich, ob ich das richtig mache? Ich habe noch nicht die ganze Methode geschrieben (wenn es fertig ist, wird es ziemlich lang sein), aber ich möchte wissen, ob ich das Pointer-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 etwas nicht? Ich denke, dieses Pointer-to-Pointer-Zeug klickt bei mir noch nicht. Nachdem ich ein paar allgemeine Quellen über Zeiger gelesen habe, vermute ich, dass ich es so machen würde, aber ein Teil von mir versteht nicht, warum das Argument ar nicht einfach ein regulärer Zeiger sein kann (im Gegensatz zu einem Zeiger auf Zeiger). .

Antwort

6

Zeiger auf Zeiger sind ein bisschen escherisch, ja. Der einfachste Weg wäre, ein leeres Array in A zu erstellen und einen regulären Array-Pointer an B zu übergeben, der es nur füllt. Wenn Sie zum Erstellen des Arrays in B bestehen darauf, ich glaube, Sie dies tun könnten:

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

+1 obwohl es wäre am besten, wenn '(newArray = nil!) Zu überprüfen', nur so Sie haben nicht versehentlich einen Nullzeiger dereferenziert. :) –

+0

Rechts. Ich erwähnte diese Möglichkeit nur, um die Frage von Zeiger zu Zeiger zu beantworten, in der Praxis würde ich sicherlich die einfachere Lösung verwenden, die ich zuerst erwähnte. Ich werde eine Aussage hinzufügen, um die Dinge klarzustellen. – zoul

+0

Danke, ich habe nicht einmal daran gedacht, das Objekt zuerst in Klasse A zu erstellen und einen Zeiger darauf an die Klasse-B-Methode zu übergeben. Auch bei deinem Beispiel glaube ich, dass ich das verstehe. Die Übergabe der Adresse eines Zeigers im Argument newArray sendet tatsächlich eine Kopie eines Zeigers an den Zeiger, und durch Dereferenzierung erhalten Sie den Zeiger selbst, dem Sie dann eine neue Adresse zuweisen können, richtig? – Adam

2

Zeiger auf Objekte ändern, wie dies in Objective-C ziemlich ungewöhnlich ist. Die Hauptzeit, in der wir so etwas sehen, ist, wenn eine Methode ein Fehlerpotenzial hat. An diesem Punkt übergeben wir einen Zeiger auf eine NSError Referenz. Zum Beispiel NSFileManager- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

Der weitaus häufiger Weg, dies zu tun, um das Array zu haben wäre die Methode zurück:

NSMutableArray * list = [ClassB mutableArrayFromSQLite];