Domanda

Sto riscontrando molti problemi con gli oggetti NSDate che vengono deallocati prematuramente. Ho il sospetto che i problemi possano essere correlati al modo in cui gestisco gli oggetti restituiti dai metodi di convenienza di NSDate. penso che la mia dichiarazione di proprietà showDate nella classe JKShow dovrebbe essere " conserva " ma cambiarla per assegnare o copiare sembra non avere alcun effetto sul problema.

JKShow *show; 
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];

// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

UPDATE

Il problema non era nel codice copiato qui. Nel mio metodo JKShow init non conservavo la data restituita dal metodo di convenienza NSDate . Grazie per il vostro aiuto a tutti.

È stato utile?

Soluzione 4

L'ho capito, grazie per tutto il tuo aiuto, ma il problema era al di fuori del codice che ho pubblicato qui. Non conservavo il NSDate creato nel mio metodo init. Purtroppo l'incidente non si è verificato fino a quando non ho creato i due nuovi oggetti NSDate , quindi stavo abbaiando totalmente l'albero sbagliato.

Altri suggerimenti

La data restituita da dateFromComponents deve essere nel pool di rilascio automatico, quindi hai ragione che la proprietà showDate deve essere " conserva " ;. In realtà dovrebbe essere comunque (a meno che tu non voglia specificamente " copia ").

Dal codice che hai mostrato sembra che tu stia dando la proprietà dell'oggetto show interamente all'elenco (mentre imposti il ??rilascio automatico su di essi mentre li aggiungi). Stai dicendo che gli oggetti data vengono deallocati prima che gli oggetti show escano dall'elenco (o che l'elenco venga deallocato)?

Inoltre, stai usando proprietà sintetizzate o le scrivi a mano? In quest'ultimo caso, come è il tuo metodo di proprietà setShowDate?

Puoi anche provare a registrare il retainCount dell'oggetto date in diversi punti (anche se trovo sempre che il rilascio automatico complica davvero quello).

Se showDate è una proprietà di mantenimento che dovrebbe essere sufficiente, dato il codice che hai pubblicato. Qualcos'altro (probabilmente nell'implementazione di JKShow) potrebbe non essere corretto.

Se vuoi capire cosa sta succedendo, puoi usare Strumenti per vedere esaminare la durata degli oggetti. È necessario eseguirlo con il set di strumenti di allocazione per ricordare i blocchi e le versioni. Per impostazione predefinita, è impostato in questo modo se si esegue lo strumento di prestazioni di perdite.

Quando esegui Strumenti in questo modo, registrerai tutte le durate degli oggetti e il backtrace per ogni conservazione e rilascio emesso contro di loro. Se guardi attraverso gli oggetti, trovi una delle tue date e guardi tutte le conservazioni e le versioni dovresti essere in grado di determinare dove sta avvenendo la versione spuria.

Il codice che hai mostrato non ha problemi di rilascio prematuro. In effetti, perderà l'array e tutto ciò che contiene, poiché non rilascia l'array.

Stai funzionando con il Garbage Collector attivato?

list è una variabile di istanza o variabile statica o è una variabile locale?

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