Ho un grosso problema e non capisco molto bene perché si verifica. Questo è il caso:Il progetto Cocos2D con molte scene non rilascia correttamente la memoria
- Avere un grande progetto in Cocos2D con 10 scene. Ogni scena è una pagina di un libro con enormi folletti. Utilizza l'implementazione di Kobold2D 1.0.2.
- Ogni pagina contiene oggetti comuni in una classe singleton, per mettere un menu comune tramite LayerColor.
- Gli sprite sono TexturePacker in PVR.CCZ RGBA4444 e nella memoria iPad sono circa 16-20 Mb ogni spites caricato.
- Uso CCTransitionTurnPage per replaceScene per uno a quello successivo.
- Al metodo init di ciascuna pagina (classe), caricare la trama e FrameFile.
- Al metodo onExit di ogni pagina (classe), scaricare le trame e il file di frame. Ho usato il dumpCachedTextureInfo e mi ha detto che le trame vengono caricate e scaricate perfettamente dalla memoria.
- Ovviamente rimuovo dal bambino tutti gli oggetti. Tutti i miei sprite sono variabili comuni dichiarate nella sezione dell'interfaccia in .h, perché ho bisogno di accedervi in ogni metodo della classe.
- Il mio progetto è realizzato con l'integrazione Kobold2D in un progetto ARC (ma si sa il progetto Kobold2D allegato è ARC non abilitato per problemi di compatibilità)
Il fatto è che quando avvio il progetto, tutto sembra perfetto, ma la memoria sta aumentando per ogni scena (pagina) che ho creato. Pagina1: 30 Mb., Pagina 2: 40, Pagina 3: 54, Pagina 4: 65 ... Dopo 7 o 8 scene, Strumenti, Xcode o l'iPad stesso blocca l'applicazione senza alcun messaggio (eccetto Strumenti con un Avviso di memoria insufficiente finale) .
Perché non viene rilasciata memoria dopo ogni scena? Forse è perché ARC e la variabile no super dealloc. Perché le trame sembrano scaricare perfettamente ma sembra che non ci sia lo scaricamento perché la memoria cresce senza controllo fino allo schianto?
Impostare un punto di interruzione nel metodo dealloc di una scena, se non si chiama dealloc si ha un ciclo di conservazione (ARC non può impedirlo, consultare anche: http://stackoverflow.com/questions/3634435/can-any -one-spiega-mantenere-ciclo-con-esempio-codeobjective-c-e-how-can-noi). In particolare, verifica che nessuna delle proprietà CCNode * abbia attributi forti o deboli, dovrebbero essere impostati per l'assegnazione. – LearnCocos2D
Infine devo disattivare ARC, a causa di questo ciclo di conservazione sulla scena. Non riesco a trovare alcuna soluzione per fare un vero dealloc di ogni scena e devo disabilitare ARC. Quando lo faccio, tutto va bene. RemoveAllTextures ora congela la memoria (con ARC no) e super dealloc funziona perfettamente. Quando ho abilitato l'override di ARC, non ho attivato dealloc, e ho usato onExit per scaricare trame e bloccare la memoria, ma non funziona. Grazie mille per il vostro aiuto! –
Molto probabilmente la disattivazione di ARC ha cambiato il modo in cui si comportano i bug del codice, in particolare se si dispone di un ARC di riferimento circolare o di ARC non dovrebbe fare alcuna differenza. È possibile che tu stia perdendo oggetti in silenzio. – LearnCocos2D