Domanda

Mi sto perdendo nella terra dei puntatori, credo. Ho questo (la sintassi del codice potrebbe essere un po 'fuori, non sto guardando la macchina con questo codice su di esso ... ma tutti i dettagli pertinenti sono corretti):

NSMutableArray *tmp = [[NSMutableArray alloc] init];

Li faccio passare a una routine in un'altra classe

- (BOOL)myRoutine: (NSMutableArray *)inArray
{
    // Adds items to the array -- if I break at the end of this function, the inArray variable has a count of 10
}

Ma quando il codice ritorna nella routine di chiamata, [conteggio tmp] è 0.

Mi manca qualcosa di molto semplice ma fondamentale, ma per la mia vita non riesco a vederlo. Qualcuno può sottolineare cosa sto facendo di sbagliato?

EDIT: www.stray-bits.com mi ha chiesto se ho conservato un riferimento ad esso, e ho detto " forse ... abbiamo provato questo: NSMutableArray * tmp = [[[[NSMutableArray alloc] init] keep]; non sono sicuro se questo è quello che vuoi dire, o se l'ho fatto bene.

EDIT2: Mike McMaster e Andy - allora probabilmente avete ragione. Non ho il codice qui (è sulla macchina di un collega e se ne sono andati per il giorno), ma per riempire l'array di valori stavamo facendo qualcosa sulla falsariga di usare un oggetto decoder (?).

Lo scopo di questa funzione è aprire un file dall'iPhone, leggere quel file in un array (è un array di oggetti che abbiamo salvato in una precedente esecuzione del programma). Quel "decodificatore" cosa ha un metodo che mette i dati nella matrice.

Amico, l'ho macellato completamente. Spero davvero che tutti voi possiate seguirlo, e grazie per il consiglio. Lo esamineremo più da vicino.

È stato utile?

Soluzione

In questo caso non è necessario chiamare la conservazione. [[NSMutableArray alloc] init] crea l'oggetto con un conteggio di mantenimento di 1, quindi non verrà rilasciato fino a quando non lo rilasci specificatamente.

Sarebbe bello vedere più codice. Non credo che l'errore sia nella quantità molto piccola che hai pubblicato finora ..

Altri suggerimenti

Sono d'accordo con Mike - in base al codice che hai pubblicato, sembra corretto. Oltre a pubblicare il codice utilizzato per chiamare la funzione e aggiungere elementi all'array, è possibile provare a controllare gli indirizzi di memoria del puntatore alla fine della funzione (quando ha tutti gli oggetti) e anche una volta restituito (quando non ha oggetti). Non sono sicuro del motivo per cui sarebbe diverso, ma anche in questo caso gli elementi dovrebbero rimanere nell'array.

Devi mostrarci un po 'di più di come stai aggiungendo oggetti all'array per aiutarci davvero.

Ho visto molte persone scrivere codice in questo modo:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];

array = [foo bar];

Le persone che lo fanno pensano che " crea e quindi imposta " un array mutabile, ma non è affatto quello che fa. Invece, crea un array mutabile, lo assegna alla variabile denominata array , quindi assegna un diverso array mutabile a quella variabile.

Quindi assicurati di non confondere la variabile per l'oggetto a cui è un riferimento. L'oggetto non è la variabile, è interagito con attraverso la variabile.

NSMutableArray conserva gli oggetti aggiunti ad esso, ma hai mantenuto l'array stesso?

Il codice che hai pubblicato dovrebbe funzionare. Devi fare qualcosa di divertente nella funzione di decodifica.

Non dovresti conservare quell'array. Viene mantenuto automaticamente con init. Se lo conservi, perderai memoria. Se hai appena iniziato con l'obiettivo c, prenditi del tempo e leggi "Introduzione alla Guida alla programmazione della gestione della memoria per Cocoa". Ti risparmierà un sacco di mal di testa.

Perché stai scrivendo così tanto codice per leggere un array da un file? È già supportato dal framework:

  

+ arrayWithContentsOfFile:

     

Restituisce un array inizializzato dal contenuto di un file specificato.   Il file specificato può essere completo o   percorso relativo; il file che esso   i nomi devono contenere una stringa   rappresentazione di un array, come ad esempio   quello prodotto dal   writeToFile: atomically: method.

Quindi puoi farlo:

NSMuatableArray *myArray = [NSMutableArray arrayWithContentsOfFile:@"path/to/my/file"];

Questo è un metodo pratico, quindi l'oggetto verrà rilasciato automaticamente. Assicurati di conservare questo se vuoi tenerlo in giro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top