Cos’è il jetsam di iOS e come funziona esattamente?

Jetsam controlla l'uso della memoria e uccide le applicazioni che non sono buoni cittadini della memoria. Un buon cittadino della memoria è un'applicazione che è disposta a restituire la memoria quando richiesto e non continua a chiedere più memoria.

Per essere un buon cittadino della memoria e non essere ucciso da Jetsam, un'applicazione dovrebbe usare le seguenti tecniche:

  • Inizializzatori pigri su tutti gli oggetti che possono richiedere molta memoria e che possono essere facilmente ricreati.
  • NSCache combinata con NSPurgeableData per qualsiasi risorsa di memoria di grandi dimensioni che proviene da una fonte esterna e che richiede notevoli cicli di CPU per essere ricreata. Questo è particolarmente utile per cose come le immagini elaborate degli avatar caricate dal web o da un database. Per esempio, se avete celle CollectionView che usano immagini individuali per ogni cella e queste immagini hanno qualcosa come una maschera circolare, potete mettere in cache l'immagine per riutilizzarla e svuotare la cache quando la memoria è necessaria. Questo accelererà le prestazioni della vostra app e le permetterà di essere un buon cittadino restituendo la memoria quando richiesto.
  • Streaming dei dati dei file che devono essere elaborati piuttosto che caricare tutti i dati in memoria. Se l'app ha bisogno di processare un file di grandi dimensioni per estrarre informazioni, l'utilizzo di un accesso mappato in memoria al file può ridurre enormemente l'impronta di memoria e impedire che la vostra app si gonfi e che si inneschi Jetsam.
  • Nel ViewController's viewDidDisappear, nil out qualsiasi risorsa che può essere facilmente ricreata in viewWillAppear. Questo è importante per minimizzare l'impronta di fondo se la tua app viene eseguita in background. Lo stesso vale per il metodo AppDelegate applicationDidEnterBackground:
  • Monitorare il metodo ApplicationDidReceiveMemoryWarning:, e il metodo didReceiveMemoryWarning del ViewController per rilasciare le risorse ricreabili descritte sopra.
  • Utilizzate lo strumento Allocations profile con il reference counting on per controllare che non abbiate cicli di riferimento che impediscono il rilascio delle risorse.
  • In modalità test/debug, potete far chiamare alla vostra app i metodi memoryWarning e vedere se la memoria viene rilasciata.

Una nota importante su Jetsam, sembra essere molto importante che un'app sia disposta a cedere della memoria. Questo è altrettanto importante se non più importante della quantità assoluta di memoria utilizzata. Quindi, che la vostra app usi 50MB o 150MB, deve essere in grado di restituire un po' di memoria quando le viene chiesto per evitare di essere uccisa da Jetsam.

Qui c'è un ottimo video dato da Conrad Kramer su Jetsam e su come rimanere in vita.

536793969_1280.jpg