2009-12-03 11 views
8

Ho un codice molto semplice per mostrare un controller modale (nextController è un membro della classe):Utilizzando dismissModalViewControllerAnimated non libererà la memoria

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil]; 
[self presentModalViewController:nextController animated:YES]; 
[nextController release]; 

E poi, quando il controllore deve nascondere:

[self dismissModalViewControllerAnimated:YES]; 
nextController = nil; 

Tutto funziona come previsto, ma quando eseguo lo strumento Allocazione oggetti mostra che dopo aver chiuso il controller modale la memoria allocata non viene liberata. Questo diventa un problema perché quando mostro diversi controller la memoria è finita ...

Qualcuno può darmi qualche indizio? Clang non vede alcun problema, quindi sono bloccato a raggiungere il limite di memoria, perché la memoria dei controller dismessi non verrà rilasciata.


EDIT: Quello che ho scoperto fino ad ora è che sembra essere una perdita da qualche parte nelle cose di Apple. Modo di riprodurre: XCode -> crea un nuovo progetto con il modello "Applicazione di utilità". Non scrivere alcun codice tu stesso. Basta creare una nuova applicazione di utilità ed eseguirla con "Allocazione oggetto", scegliere di vedere "Creato & Ancora in vita". Ora capovolgi il controller modale alcune volte - vedrai che la memoria allocata cresce e cresce ogni volta che appare il controller modale e anche quando scompare ...

risposta

0

Le viste modali non sono subviews della vista chiamante ma sono invece sottoview della finestra delle app e sono conservati dalla finestra stessa. In genere non conservi alcun riferimento a loro nel controller che li chiama. Invece, richiama la vista modale e poi comunica con il controller definendo il controller come delegato della vista modale.

Penso che se si utilizza sintetizzare per creare l'accessor per una proprietà nextController definita con retain, l'accessor manterrà qualsiasi oggetto assegnato alla proprietà. Semplicemente impostando il valore su nil non rilasceremo l'oggetto a meno che l'accessor non sia impostato per farlo e non penso che siano gli autogenerati a farlo.

È necessario chiamare lo release prima di impostare su zero.

Se ciò non funziona, inserire il codice per la definizione della proprietà nextController.

+1

Come ho detto nextController è un membro, non una proprietà: @interface MainScreenViewController: UIViewController { id nextController; } utilizzando "release" invece di assegnare nextController a "nil" porta a un'eccezione: messaggio viewDidDisappear: inviato all'oggetto liberato. L'oggetto sembra essere liberato, tuttavia lo strumento di assegnazione degli oggetti "creato e ancora vivo", mostra solo un crescente e crescente utilizzo della memoria. –

1

Non c'è nessuna perdita nel codice che mostri per quanto posso vedere. Ci potrebbe essere una perdita in InstructionsScreen che impedirebbe di essere deallocato.

Penso che valga la pena eseguire l'Analizzatore statico per vedere se trova una perdita.

La perdita nel codice del modello Apple è interessante. Potrebbe essere che ci sia una perdita. Sembra improbabile ma ovviamente non è impossibile. Direi che è più probabile che sia un falso positivo in Strumenti, ed è per questo che suggerirei di usare lo Static Analyzer.

(È possibile che si desideri generare un bug report sulla perdita.)

Problemi correlati