2010-11-18 11 views

risposta

13

Questa risposta del decennio precedente,

è ora solo di interesse storico.

Oggi, è necessario utilizzare ARC.

Acclamazioni


La risposta molto breve è DO NOT basta impostarlo a zero. È necessario rilasciarlo. Impostarlo su zero non ha alcuna connessione al rilascio. Devi liberarlo.

Tuttavia vale la pena ricordare che se si tratta di una proprietà, quindi

self.obj = nil; 

sarà in un dato di fatto rilasciare per voi. Certo, non devi dimenticare il "sé". parte !!!!

Infatti,

self.obj = anyNewValue; 

sarà davvero liberare la vecchia memoria per voi, pulire tutto magicamente e configurarlo con il nuovo valore. Quindi, self.obj = nil è solo un caso speciale di questo, rilascia e pulisce tutto e poi lo lascia a zero.

Quindi se qualcuno leggendo questa è nuovo e completamente confuso dalla memoria,

  1. Devi rilasciarlo, [x rilascio] prima di impostarla a zero x = nil

  2. SE voi stanno usando una proprietà, "non dimenticate il sé. thingy"

  3. SE si sta utilizzando una proprietà, si può semplicemente dire self.x = nil o effettivamente sel f.x = somethingNew e si prenderà cura del rilascio e di tutte le altre cose complicate e fastidiose.

  4. Alla fine dovrai imparare tutte le cose complicate su rilascio, autorelease, blah blah blah. Ma la vita è breve, non pensarci più: -/

Spero che aiuti qualcuno.

Ancora una volta, questo post è ora completamente sbagliato. Usa ARC.

Solo per interessi storici.

+0

Il bit sulle proprietà che vengono rilasciate magicamente non è completamente vero. Se dichiari una proprietà con l'attributo "retain", devi rilasciarlo da solo, solo se lo dichiari con l'attributo "copy", viene rilasciato per te nel modo descritto. Vedere http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – dertoni

+0

Penso che potrebbe aver significato "assegnare", non "conservare". Inoltre, self.obj = someNewValue non dovrebbe attivare gli ascoltatori di KVO? –

+1

Per chiarire, self.obj = newValue rilascia il vecchio valore, se si stanno utilizzando le proprietà correttamente. Mi piacerebbe aggiungere che self.obj = newValue è identico a [self setObj: newValue], che è il modo in cui avviene il rilascio (il metodo setObj contiene [oldValue release]). Inoltre, se stai rilasciando l'oggetto, non vorresti che KVO venisse attivato? – andyvn22

5

iOS non supporta la garbage collection, il che significa che fare obj = nil causerebbe una perdita di memoria. Se si desidera il controllo automatico sulla deallocazione, è necessario fare qualcosa come: obj = [[[NSObject alloc] init] autorelease] (è necessario NON rilasciarlo se lo si fa). Autorelease causerebbe il rilascio automatico dell'oggetto al termine dell'evento NSRunloop corrente. NSRunloop drena automaticamente il suo NSAutoReleasePool per ogni iterazione di eventi, che di solito è molto utile.

+0

Ho un puntatore, a volte ho impostato il punto su un oggetto, a volte non lo faccio. Quindi, quando voglio rilasciare un puntatore che devo controllare è zero? –

+1

Perché è necessario verificare la presenza di nil al momento del rilascio? È perfettamente valido in ogg-c per inviare un messaggio a un puntatore nullo, semplicemente non fa nulla. Dovresti comunque inizializzare il puntatore, a zero o qualche altro oggetto valido. – ImHuntingWabbits

+0

Non capisco perché sia ​​una buona idea controllare nil prima di rilasciarlo. L'invio a zero del rilascio è perfettamente valido, e i "veri" programmatori non principianti lo fanno sempre. Perché imparare ad evitare qualcosa che è una pratica comune accettata? – andyvn22

2

L'impostazione di un oggetto nil creerà una perdita di memoria (se si acquisisce la proprietà allocandola, conservandola o copiandola) perché non si dispone di un puntatore a quella particolare posizione di memoria.

quindi, se si desidera deallocare un oggetto, è necessario eliminare la proprietà di un oggetto prima di renderlo nulla chiamando il metodo di rilascio.

[obj release]; 
obj=nil; 
Problemi correlati