Impostazione di un oggetto nullo rispetto al rilascio + realloc

voti
9

Questo non è un ambiente di garbage collection

Ho una variabile di istanza di classe, che ad un certo punto della mia runtime, ho bisogno di ri-inizializzare con un set di dati diverso da quello che è stato originariamente costruito con.

Ipoteticamente parlando, che cosa se ho un NSMutableArrayo un NSMutableDictionary, sarebbe più efficiente di fare qualcosa come:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

o semplicemente,

myArr = nil;

Sarà myArr rilasciare l'oggetto e lasciarmi senza un puntatore alla memoria in memoria in modo da poter riutilizzare myArr?

È pubblicato 09/03/2009 alle 17:03
fonte dall'utente
In altre lingue...                            


6 risposte

voti
21

Se lo fai myArr=nil;da solo, allora hai perso il puntatore a cui è possibile inviare il releasemessaggio. Non c'è magia per releasel'oggetto.

E, come dice Georg, senza essere in grado di rilasciare l'oggetto, che la memoria si e 'trapelato'.

Risposto il 09/03/2009 a 17:07
fonte dall'utente

voti
6

Si potrebbe utilizzare una proprietà e ottenere quasi la sintassi che si desidera senza la perdita di memoria.

Utilizzare questa sintassi per dichiarare la matrice

@property (readwrite, retain) NSMutableArray *myArray;

Poi ri-inizializzare in questo modo:

[self setMyArray:[NSMutableArray array]];
Risposto il 09/03/2009 a 17:59
fonte dall'utente

voti
5

Se tu fossi su Mac OS, iPhone OS non direi che dipende dal fatto che il garbage collector è attivata o meno:

  • GC: uso myArr = nil;
  • senza GC: uso [myArr release];

Purtroppo, su iPhone, non c'è la raccolta dei rifiuti, quindi se non volete le perdite di memoria, si deve liberare l'oggetto una volta che non è più necessaria.

Risposto il 09/03/2009 a 17:13
fonte dall'utente

voti
4

Il primo blocco di codice è soddisfacente. Tuttavia, il secondo blocco non si lascia con una matrice è possibile utilizzare in modo che non è sufficiente. La metà correggere quel blocco, Credo che si intende:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Tuttavia, questo non compie ciò che si vuole o perché non si sta rilasciando myArr. Se è stato sintetizzato un setter per myArr, allora si può ottenere il comportamento di rilascio che si desidera da impostare a zero, utilizzando il setter (self.myArr) invece di accedere il puntatore direttamente (myArr). Correzione completamente il secondo blocco:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Ora abbiamo esempi di codice equivalenti, uno che utilizza setter con zero a rilasciare, l'altro no. Loro sono la stessa cosa.

Se myArr è una matrice mutevole come in questi esempi, il metodo più efficace è quello di utilizzare removeAllObjects, evitando tutto il lavoro di liberare memoria solo la rivendicazione indietro:

[myArr removeAllObjects];
Risposto il 02/12/2009 a 11:08
fonte dall'utente

voti
1

Se quello che vuoi è quello di ripristinare il contenuto di un NSMutableArray / NSMutableDictionary, è anche possibile chiamare removeAllObjects e si dispone di una nuova serie / dict con cui lavorare.

Risposto il 13/03/2009 a 22:37
fonte dall'utente

voti
1

Un modo per realizzare la differenza potrebbe essere questo: Impostazione di un riferimento a un oggetto a zero non fa nulla per l'oggetto, lo fa solo qualcosa al riferimento.

"Rilascio l'oggetto" non è "niente", in modo che non lo fa. :) In un linguaggio di garbage collection potrebbe farlo come un effetto collaterale di far cadere il riferimento, ma in Objective C non funziona in questo modo.

Risposto il 09/03/2009 a 17:09
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more