50 viste come te descrivono suoni come un grande spreco di memoria. Quindi sospetto che la gestione della memoria stia scaricando alcune visualizzazioni. Poi, quando il tuo programma ha bisogno delle viste, non ci sono e il tuo programma si arresta in modo anomalo. Il messaggio di errore non si adatta perfettamente a questo, ma potrebbe non dirti esattamente quale sia il problema.
Considerare il seguente scenario possibile e vedere se si adatta a come è stato codificato questo programma.
Per consentire al sistema operativo di gestire la memoria, è possibile scaricare le viste e ricaricarle se necessario. Al termine, vengono richiamati i metodi viewDidUnload, loadView e viewDidLoad.
viewDidUnload:
Questo metodo è chiamato come controparte del metodo viewDidLoad. Viene chiamato durante le condizioni di memoria insufficiente quando il controller di visualizzazione deve rilasciare la sua vista e tutti gli oggetti associati a quella vista per liberare memoria. Poiché i controller di visualizzazione spesso memorizzano riferimenti a viste e altri oggetti correlati alla vista, è necessario utilizzare questo metodo per rinunciare alla proprietà in tali oggetti in modo che la memoria per essi possa essere recuperata. Dovresti farlo solo per oggetti che puoi facilmente ricreare in seguito, nel tuo metodo viewDidLoad o da altre parti della tua applicazione. Non utilizzare questo metodo per rilasciare dati utente o altre informazioni che non possono essere facilmente ricreate.
loadview:
Il controller di visualizzare le chiamate questo metodo quando la proprietà View è richiesta ma è attualmente pari a zero. Se si creano le viste manualmente, è necessario sovrascrivere questo metodo e utilizzarlo per creare le viste. Se si utilizza Interface Builder per creare le viste e inizializzare il controller della vista, ovvero inizializzare la vista utilizzando il metodo initWithNibName: bundle:, impostare direttamente le proprietà nibName e nibBundle oppure creare entrambe le viste e il controller di visualizzazione in Interface Builder- quindi non devi ignorare questo metodo.
Controllare l'UIView Classe di riferimento -
viewDidLoad:
Questo metodo viene chiamato dopo che il controller della vista ha caricato i suoi panorami associati nella memoria. Questo metodo viene chiamato indipendentemente dal fatto che le viste siano state memorizzate in un file pennino o create a livello di codice nel metodo loadView. Questo metodo è più comunemente utilizzato per eseguire ulteriori passaggi di inizializzazione su viste caricate dai file pennino.
È possibile che queste viste siano state inizializzate inavvertitamente nei metodi di inizializzazione anziché nei metodi loadView. Se l'operazione è stata eseguita, quando il sistema operativo scarica una vista (viene visualizzato viewDidUnload), la memoria associata alla vista e tutte le sottoview (tutte le immagini e le animazioni) verranno scaricate. Ciò consente di risparmiare memoria, ma quando è necessario riapparire una di quelle viste non caricate, loadView verrà chiamato per primo se la vista è stata precedentemente scaricata. Se la configurazione della vista viene eseguita nei metodi init piuttosto che in loadView, la vista non verrà nuovamente impostata. Ma se l'impostazione della vista viene eseguita in metodo loadView, può essere ripristinata dopo che la gestione della memoria lo ha scaricato.
Hai provato a eseguire "Analyzer" per vedere se rileva eventuali perdite? – 5StringRyan
@HansGruber: Sì, abbiamo provato a funzionare con perdite di memoria, ma non abbiamo trovato alcuna fuga. Qualsiasi altra soluzione sullo stesso per favore .. Grazie .. –
L'analizzatore e le perdite sono strumenti diversi. C'è un analizzatore di clang statico che puoi usare per trovare non solo perdite di memoria ma anche altri punti problematici nel codice. È una buona idea eseguirlo periodicamente. Si noti che l'analizzatore clang statico non funziona sotto gli strumenti e non è uno strumento di profilazione. Lo troverai sotto il menu Prodotti. "Prodotti> Analizza". Le perdite invece sono uno strumento di profilazione per monitorare gli oggetti per vedere se non vengono rilasciati dopo che tutti i riferimenti all'oggetto sono stati rimossi. – Sam