2014-10-10 13 views
8

personalizzato KeyBoard ottenere terminato a causa della pressione della memoria in iOS 8tastiera personalizzata ottenere terminato a causa della pressione della memoria in iOS 8

Inizialmente la mia tastiera personalizzata sta prendendo in giro 25 MB di memoria, ma questa memoria non è deallocata con ho dissmiss la tastiera. La memoria continua ad aumentare quando apriamo la tastiera personalizzata ancora e ancora e finalmente terminata a causa della pressione della memoria.

Aiutami con questo problema?

+0

Si prega di inserire il codice in cui si è esattamente di fronte al problema? – iGW

risposta

1

Puoi dealloc alcune cose nella funzione ViewWillDisappear di KeyboardViewController

1

L'estensione della tastiera viene eseguito in un processo che persiste dopo la tastiera scompare. Il controller di visualizzazione delle tastiere viene creato di nuovo ogni volta che viene creata la tastiera, ma il processo in cui il controller di visualizzazione è in corso. Quindi memoria libera quando il tuo controller di visualizzazione è chiuso. Se stai usando le immagini non vorrai usare imageNamed: vorrete usare imageWithContentsOfFile :. Perché UIImage utilizza una cache per imageNamed che persisterà.

1

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.

+0

Ho a che fare con questo problema come te. Ho provato "exit (0);" è super efficace. Semplicemente uccide il processo. Tuttavia renderà la tastiera lenta ogni volta chiamata. Penso che iOS abbia memorizzato nella cache la tastiera per avere un processo più veloce. Ho provato a rimuovere tutte le sottoview, i vincoli, ma sembra che il processo sia ancora lì, e la memoria continua ad aumentare ogni volta che uso la tastiera :( – TomSawyer

+0

In generale, tutti gli "oggetti" personalizzati che hai creato devono essere rimossi in viewWillDisappear prima Ma il punto è che dovresti rimuovere tutti gli "oggetti" personalizzati, non solo le viste personalizzate e i vincoli per evitare perdite di memoria iOS e infine crash della tastiera. Controlla se hai rimosso anche array, dizionari, insiemi o qualsiasi altro oggetto tu Ho creato. È davvero fastidioso ma funziona. – NeonBerry

+0

Ho rimosso tutti gli oggetti inclusi: istanza di classe, vincoli, viste, dizionari ... E alcune app non sono state eseguite come (viber), non so perché. lasciare alcune variabili E se ho già rimosso tutte le viste, devo rimuovere anche i vincoli e i gesti? Fondamentalmente, se ho rimosso le viste, i vincoli sono automaticamente r anch'io – TomSawyer

Problemi correlati