2010-09-09 5 views
6

Occasionalmente in condizioni di memoria insufficiente l'UIImagePickerController che uso viene bloccato con l'otturatore chiuso. Generalmente, quando questo WatchDog sta già abbandonando altre app in background, in un secondo o due la condizione di memoria insufficiente è finita, eppure il controller UIImagePicker è ancora bloccato.UIImagePickerController in modalità fotocamera si "blocca" con l'otturatore chiuso

Qualcun altro l'ha riscontrato e ha implementato una soluzione alternativa o trovato un modo per rilevare quando il raccoglitore si trova in questo stato, in modo che possa essere rimosso e sostituito da uno nuovo.

Pensieri/idee/soluzioni ??

risposta

2

Avete provato ad allocare (e quindi liberare) un megabyte o due di memoria usando malloc() prima di avviare UIImagePicker? Oppure reclamalo leggermente prima nella tua app, quindi rilascialo quando vuoi mostrare il selettore.

Immagino che dovresti essere in grado di vedere approssimativamente la quantità di memoria che UIImagePicker deve eseguire correttamente eseguendo la tua app all'interno degli strumenti.

Anche se non è l'ideale, è necessario che altre app ricevano gli avvisi di memoria in precedenza e quindi UIImagePicker dovrebbe disporre di memoria sufficiente per l'esecuzione.

+0

Se si utilizza un NSTimer ripetuto per pianificare un gruppo di mallocs in blocchi di dimensioni frazionarie per diversi millisecondi, questo consentirà più tempo per gli avvisi di memoria di ripulire l'utilizzo della memoria di qualsiasi altra app in background. Quindi liberare tutto ciò appena prima di chiamare il selettore di immagini. – hotpaw2

+0

@ hotpaw2: Sì, probabilmente è una buona idea, grazie! Penso che avrei reso i blocchi abbastanza grandi (e probabilmente non più piccoli del blocco più grande che UIImagePicker richiede), poiché vi è il rischio di introdurre altrimenti la frammentazione nell'heap dell'applicazione. – JosephH

+0

Ho giocato un po 'con questo. Strangley abbastanza, semplicemente facendo un allocazione –

0

Anche questo è un comportamento noto dell'applicazione fotocamera. Immagino che non puoi farci nulla se non liberare più memoria possibile prima di avviarla. Potresti creare una memoria che ti avvisi in modo che ogni applicazione possa riceverla e iniziare a liberare memoria, ma non ho idea di come sia possibile farlo. Ho iniziato a indagare inviando la notifica da solo (UIApplicationDidReceiveMemoryWarningNotification) senza successo. Suppongo che dobbiamo inviare un oggetto lungo la notifica per definire il livello di avviso, ma non sono sicuro.

+0

Non è possibile generare autonomamente una notifica di avviso di sistema - 'UIApplicationDidReceiveMemoryWarningNotification' è la notifica che è solo interna all'applicazione. – rpetrich

+0

@rpetrich: Grazie! – VdesmedT