2012-03-18 14 views
18

Nella mia app ho una vista di scorrimento e quattro viste di tabella. Ogni volta che uno viene trascinato e poi rilasciato, ottengo una perdita di 48 byte. Questo davvero aggiunge. Come puoi vedere, entrambi i gruppi di perdite hanno la stessa fonte. Qualcuno ha mai visto una perdita simile prima?Perdita di memoria ogni volta che viene rilasciato UIScrollView




Edit 1:

Quando clicco sulla freccia accanto alla perdita, ho questa informazione per la perdita:

risposta

28

Quello che stai vedendo è un bug noto in iOS 5.1 ed è in discussione nei forum degli sviluppatori iOS in quanto tale. Puoi trovare il thread pertinente cercando nel forum "strdup". Vedi il thread intitolato "Elementi App Memory Leak". Cerca il post da un dipendente Apple.

+0

Ah, capisco. Sembra che non ci sia nulla che possa essere fatto a questo scopo. Grazie per la risposta! –

+0

Certo, questo è tutto ciò che riguarda Stack ... ottenere risposte! –

0

Molto probabilmente, è colpa tua, in qualche modo.

Nello strumento Allocations, premere il pulsante "i" e attivare "Record Reference Counts". Quindi gli strumenti possono mostrare tutte le allocazioni, conservare, autorizzare e rilasciare gli eventi accaduti a tali oggetti. (Dovresti vedere una freccia accanto a ogni articolo trapelato: fai clic su di esso per visualizzare la cronologia di allocazione dell'oggetto.)

Penso che troverai che parte del tuo codice trattiene qualcosa o indirettamente lo fa diventare mantenuto. Probabilmente la vista di scorrimento o uno dei suoi riconoscitori di gesti, come ipotesi.

+0

Record di riferimento che conta è acceso, ma come faccio a vedere gli oggetti trapelate dall'interno allocazioni? Riesco a vedere gli oggetti trapelati in Leaks (duh), ma non riesco a vedere dove sono stati mantenuti/rilasciati/autorelati. –

+0

Ho appena provato questo usando Xcode 4.3.1, usando il preset "Leaks" in Strumenti. Registrare i conteggi di riferimento era già attivo. Nell'elenco degli oggetti trapelati, nella colonna "Indirizzo", c'è un'icona a forma di freccia: fai clic per mostrare la cronologia di quell'indirizzo. Se la freccia non viene mostrata, la cosa migliore che posso suggerire è giocare con le impostazioni in Strumenti. –

+0

Trovato, ma le informazioni non sono estremamente utili. Modifica nei miei risultati. –

0

Una soluzione:

mi sono reso conto che in qualche modo questo trapelata byte vengono memorizzati all'interno del ScrollView. Devi rilasciare la tua scrollview e assegnarla di volta in volta, mantenendo il suo stato. Il modo in cui si rileva quando è necessario ricaricare lo scrollview dipende da te, dipende dalle esigenze dell'app. Ogni volta che si rilascia la scrollview, vengono rilasciati anche questi byte.

+0

No, ho ottenuto visualizzazioni di scorrimento e viste tabella che vengono allocate e dealloc'd di volta in volta e che non risolvono la perdita. La soluzione è semplicemente aspettare la correzione ufficiale in iOS. –

0

Soluzione temporanea: ho rilevato che la perdita di memoria si è verificata in handlePan: se è impostato il delegato UIScrollView. Avevo bisogno dei metodi delegati, quindi ho sottoclassato UIScrollView e dichiarato il mio @protocol. Poi ho calpestato il selettore obiettivo per lo ScrollView panGestureRecognizer, senza inviarlo al super:

//yourScrollView.h 
@protocol yourScrollViewDelegate 
-(void)yourProtocol; 
@end 

//yourScrollView.m 
-(void)handlePan:(id)sender{ 
    [yourDelegate yourProtocol]; 
}