Domanda

Sto lavorando su un'applicazione per iPhone utilizzando obiettivo C. Ho classe A, che crea un puntatore NSMutableArray chiamato "lista". Ma, in classe A, non ho mai creato un oggetto per farlo punto. Invece, io chiamo un metodo di classe in classe B, per ottenere alcuni dati da un database SQLite, e compilare un oggetto NSMutableArray lì. Voglio essere in grado di impostare il puntatore in classe A al punto all'oggetto NSMutableArray creato nel metodo di classe B passando come argomento al metodo. Io non posso farlo restituendo l'array perché voglio restituire il risultato di SQLite.

Mi chiedo se sto facendo questo diritto? Non ho ancora scritto l'intero metodo (quando è fatto sarà piuttosto lunga), ma voglio sapere se sto facendo la roba puntatore correttamente prima di iniziare con il resto.

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

Ho fatto bene? O sto non capire qualcosa? Credo che questa roba puntatore a puntatore solo non fa clic con me ancora. Dopo aver letto alcune fonti generali su puntatori, ho il sospetto questo è come lo farei, ma una parte di me non capisce perché l'argomento ar non può essere solo un puntatore regolare (al contrario di un puntatore puntatore a) .

È stato utile?

Soluzione

puntatori a puntatori sono un po 'escheric, sì. Il modo più semplice per farlo sarebbe quello di creare un array vuoto in A e passare un puntatore serie regolare di B che sarebbe solo riempirlo. Se si ha insistito sulla creazione di matrice in B, credo che si potrebbe fare questo:

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

Altri suggerimenti

La modifica puntatori a oggetti come questo è abbastanza raro in Objective-C. Il tempo principale che vediamo cose come questa è quando un metodo ha un potenziale per il fallimento, a quel punto passeremo in un puntatore a un riferimento NSError. Ad esempio, NSFileManager di - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

Il modo di gran lunga più comune per fare questo sarebbe di avere il metodo di ritorno della matrice:

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top