2010-09-09 8 views
6

Occasionnellement, dans des conditions de faible mémoire, le contrôleur UIImagePickerController que j'utilise est bloqué lorsque l'obturateur est fermé. Généralement, lorsque le WatchDog supprime déjà d'autres applications d'arrière-plan, la mémoire insuffisante est écoulée en une seconde ou deux, mais le contrôleur UIImagePicker est toujours bloqué. Est-ce que quelqu'un d'autre a rencontré cela et mis en œuvre une sorte de solution de contournement ou trouvé un moyen de détecter quand le sélecteur est dans cet état, de sorte qu'il peut être retiré et un nouveau mis à sa place.UIImagePickerController en mode caméra est bloqué lorsque l'obturateur est fermé

Réflexions/Idées/Solutions ??

Répondre

2

Avez-vous essayé d'allouer (puis de libérer) un mégaoctet ou deux de mémoire en utilisant malloc() avant de démarrer UIImagePicker? Ou revendiquez-le légèrement plus tôt dans votre application, puis relâchez-le lorsque vous souhaitez afficher le sélecteur.

Je suppose que vous devriez être capable de voir à peu près la quantité de mémoire dont UIImagePicker a besoin pour fonctionner avec succès en exécutant votre application à l'intérieur des instruments. Bien que cela ne soit pas idéal, d'autres applications devraient recevoir des avertissements de mémoire plus tôt et, par conséquent, UIImagePicker devrait avoir suffisamment de mémoire pour fonctionner.

+0

Si vous utilisez un NSTimer répétitif pour planifier un groupe de mallocs en segments de taille fractionnaire sur plusieurs millisecondes, les avertissements de mémoire auront plus de temps pour nettoyer l'utilisation de la mémoire de toutes les autres applications d'arrière-plan. Puis libérez tout cela juste avant d'appeler le sélecteur d'image. – hotpaw2

+0

@ hotpaw2: Oui, c'est probablement une bonne idée, merci! Je pense que j'avais rendu les blocs assez grands (et probablement pas plus petits que le plus grand bloc UIImagePicker), car il y a un risque d'introduire une fragmentation dans le tas de l'application sinon. – JosephH

+0

J'ai joué avec ça un peu. Strangley assez, simplement faire un alloc –

0

C'est également un comportement connu de l'application caméra. Je suppose que vous ne pouvez rien y faire sauf libérer autant de mémoire que vous pouvez avant de le démarrer. Vous pouvez lever une mémoire en vous-même, afin que chaque application la reçoive et commence à libérer de la mémoire, mais je n'ai aucune idée de comment je peux le faire. J'ai commencé à enquêter en envoyant la notification moi-même (UIApplicationDidReceiveMemoryWarningNotification) sans succès. Je suppose que nous devons envoyer un objet le long de la notification pour définir le niveau d'alerte mais je ne suis pas vraiment sûr.

+0

Vous ne pouvez pas déclencher vous-même une notification d'avertissement système - 'UIApplicationDidReceiveMemoryWarningNotification' est la notification interne à votre application uniquement. – rpetrich

+0

@rpetrich: Merci! – VdesmedT

Questions connexes