Ho provato un sacco di modi per evitare questo famoso problema di accumulo di memoria, ma secondo il mio lungo processo lungo & errori, il migliore e il modo più semplice per liberare tutta la memoria prima di una tastiera scompare è quello di chiamare exit(0)
in viewWillDisappear
di KeyboardViewController
.
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
exit(0);
}
[Update]exit(0)
era perfetto per rilasciare tutta la memoria dal momento che uccide il processo di estensione della tastiera. Sfortunatamente sembra che uccidere il processo rendesse instabile iOS.
Di conseguenza, il modo più stabile è liberare il più possibile tutti gli oggetti allocati in viewWillDisappear
. Ad esempio,
Per tutte le visualizzazioni personalizzate e tutti i controller di visualizzazione personalizzata
Rimuovere tutti i forti riferimenti dei punti di vista e le controller di vista, come subviews, vincoli, gesti, forte delegato, e così via.
[aView removeFromSuperview];
[aView removeConstraints:aView.constraints];
for (UIGestureRecognizer *recognizer in aView.gestureRecognizers)
[aView removeGestureRecognizer:recognizer];
Set nil
a tutte le proprietà dell'oggetto del controller di vista.
aViewController.anObject = nil;
Per altri grandi oggetti personalizzati
rimuovere tutti gli oggetti aggiunti da tutti gli array, dizionari, e così via.
[anArray removeAllObjects];
fare non immagini cache utilizzando imageNamed:
.
Se ben rilasciato, l'utilizzo della memoria durante il debug non sarebbe aumentato o leggermente aumentato (< 0.1MBytes per respingere). Se l'utilizzo della memoria aumenta dopo molti licenziamenti anche se gli oggetti personalizzati vengono rilasciati il più possibile, exit (0) può essere chiamato periodicamente con il rischio di scaricarli.
Si prega di inserire il codice in cui si è esattamente di fronte al problema? – iGW