2011-11-18 17 views
5

Gli strumenti mi segnala una perdita di una variabile NSDate. Ma se aggiungo ritardi e rilasci dovrebbe essere in grado di rilasciare penso, dal pool di autorelease. Probabilmente sto contando male, ma non volevo esserne sicuro. Dai un'occhiata al RefCt. Se I [Class alloc] dovrebbe generare un conteggio di ritenzione pari a 1, allora se autorizzo questo oggetto, dovrebbe essere in grado di liberare, o no?Leak in Instruments, Reference Count e Autorelease

enter image description here

risposta

6

Instruments aggiunge la conserva e rilascia per voi. Questo è ciò che ti mostra la colonna "RefCt": il totale parziale.

Se I [Classe alloc] Dovrebbe venire con un conteggio di conservare 1, ...

E in effetti lo fa; questa è la prima riga nell'elenco.

... allora se autorizzo questo oggetto, dovrebbe essere in grado di liberare, o no?

Autorelease non è un immediato -1; causa un rilascio più tardi e quello è il il -1.

In modo da avere:

  1. Allocation: +1 (= 1)
  2. Autorelease: 0 per il momento; provoca un rilascio più tardi (nessun cambiamento, in modo ancora = 1)
  3. conservare: +1 (= 2)
  4. uscita: -1 (= 1)
  5. conservare: +1 (= 2)
  6. conservare: +1 (= 3)
  7. uscita: -1 (= 2)
  8. uscita: -1 (= 1)

nota che uno dei tre Uscite è quello causato dalla Autorelease . Solo allora è -1 sostenuto.

L'oggetto necessita di un'altra versione per essere deallocato. Finché ciò non accadrà, non lo farà.

E sì, è possibile che un oggetto abbia sufficienti autoreleases in sospeso per ucciderlo quando vengono conservati prima che ciò accada e quindi mantenuto in vita. Ho visto questo accadere una volta con un oggetto che stavo sottovalutando, ma quello era il valore di una proprietà usata da un Rilegatura; il Binding ne ha mantenuto il valore e quindi l'ha tenuto in vita anche dopo che mi ero auto-rilasciato la mia ultima proprietà.