6

mia app, che utilizza ARC, fa il seguente:Ridurre la memoria di UIImages dalla fotocamera utilizzando strumenti

  1. Caricati una foto scattata con la fotocamera
  2. comprime il quadro per l'uso come una miniatura.
  3. Lo faccio utilizzando [UIImage imageWithData: UIImageJPEGRepresentation (originale, 0.1f)]
  4. ho impostato il quadro di riferimento non compresso a zero per ARC per liberare la memoria

Ripetendo questa sequenza significherà che molti compresso le miniature sono sullo schermo. Dopo circa 7 o 8 foto, l'app si blocca a causa della poca memoria.

In Strumenti, sto tentando di utilizzare le allocazioni in tandem con Memory Monitor per trovare la fonte del mio problema.

Alcune statistiche Strumenti:

Allocazione - diretta Bytes salti di circa 2 MB dopo aver scattato una foto, ma poi va giù da 1.5 MB, dopo di riferimento immagine originale è impostato a zero. Sembra essere una buona cosa, ma ...

Ecco uno stato finale dell'applicazione. #Living sembra essere molto elevato rispetto ai Byte Live, giusto?

Live Bytes #Living #Transitory Overall #Overall Bytes  
    3.72 MB 24538  80679  90.1 MB 105301 

Memory Monitor (monitoraggio testa di ispezione) - La mia applicazione si avvia a 7,5 MB e prendendo uno dei risultati di immagine in quanto un incremento del ~ 13 MB. Per lo stato che ho elencato sopra, Memory Monitor dice che l'app occupa 72,67 MB di "Real Memory" e 123,79 MB di memoria virtuale.

Dato che i Byte Live sono molto piccoli, so che sto facendo qualcosa come . Tuttavia, dato che l'impronta di memoria in altri luoghi è grande, sono anche sicuro che sto facendo qualcosa di molto sbagliato. Qualche idea su cosa potrebbe essere o su come rintracciarlo?

+0

+1 per una buona domanda. Come stai caricando le tue immagini da visualizzare sullo schermo? Stai usando '[UIImage imageNamed:]'? – Rog

+1

Ha detto che usa la fotocamera. –

+0

Qual è lo scopo di questa linea? [UIImage imageWithData: UIImageJPEGRepresentation (original, 0.1f)] Stai comprimendo l'immagine e quindi la decomponi immediatamente. Il risultato è solo uno spreco di qualità dell'immagine e tempo CPU. –

risposta

2

Eitan27,

Questo non è un problema di ARC. Si tratta di come gestire più oggetti di grandi dimensioni in memoria. iOS ha diversi meccanismi per aiutarti qui. Se scrivi l'immagine in flash e poi la riapri come dati mappati in memoria, per lo più risolvi il problema. Come? Il sistema operativo gestisce la mappatura nel footprint della memoria residente con dati immutabili. Poiché questi elementi sono immutabili e, quindi, mai sporchi, possono quindi svuotare le pagine mappate quando necessario. Lo svantaggio di questo meccanismo è il numero limitato di descrittori di file disponibili per ciascuna app.

Andrew

+0

Grazie adonoho. La tua risposta suona alla grande, anche se parli di alcune cose che non mi sono familiari. Perché esiste un limite per i descrittori di file? Salvando in flash, intendi scrivere/recuperarlo dal disco usando un nome file? O stai più o meno suggerendo di implementare qualcosa di simile a TileView/CATileLayer. – Eitan

+0

Eitan27, Ogni app ha un numero limitato di file che può essere aperto in qualsiasi momento. Il descrittore del file è la struttura dati razionata dal sistema operativo. In genere, sono disponibili solo 30 o più di questi. Con il flash, intendo la tua memoria persistente. Dato che hai questo problema di spazio, ho pensato che stavi girando su iOS. Tutti i dispositivi iOS utilizzano la memoria flash come memoria persistente. Andrew P.S. Non dimenticare di ricompensare le persone che rispondono alle tue domande con il grande segno di spunta verde. – adonoho

+0

Assolutamente sì, sto correndo su iOS. Non sono stato chiaro se il limite del descrittore di file sia sui file totali o sui file aperti in un dato momento. Sembra che sia il secondo, e che il problema verrà risolto usando un CATileLayer per aprire/visualizzare le immagini solo quando sono necessarie. – Eitan

0

Utilizzare un @autoreleasepool blocco:

@autoreleasepool { 
    //code that inits the UIImage and sets it to nil 
} 

Vedi ARC fornisce una nuova Normativa per Gestire autorelease Pools sezione del Transitioning to ARC Release Notes

+0

Non sono sicuro che ciò valga per me. L'immagine viene allocata, quindi un'istanza della mia classe di uploader riceve un riferimento all'immagine e la carica. L'autore del caricamento imposta quindi il suo riferimento su zero. Pertanto, "init" dell'immagine e "imposta su zero" si verificano in due luoghi diversi. – Eitan

Problemi correlati