web-dev-qa-db-fra.com

Avertissement de mémoire reçue. Niveau = 1 lorsque vous montrez un uiImagePickerController

Ça me rend fou!!!

Je reçois un "avertissement de mémoire reçue. Niveau = 1" Chaque fois que j'essaie d'afficher un UiImagePickerController avec un SourceType = UiImagePickerControlSourceTypecamera.

Voici le code de mon point de vueDidLoad où je fixe les choses:

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

Et voici comment je le présente modellement ..

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];

}

Le résultat ... UiImagePicker commence à montrer, puis à boom ... Je reçois la mémoire Avertissement ... à chaque fois! Il est intéressant de noter que si je passe à SourceType = UiImagePickerControlsourcePephotolibary ... tout fonctionne bien.

Qu'est-ce que je manque ou fais mal? Tout ce que je veux faire, c'est montrer la caméra, prendre et enregistrer une photo.

FYI - Je teste sur mon appareil 3GS.

Merci à quiconque peut aider :)

22
wgpubs

Ceci est très courant . Tant que vous gérez l'avertissement de la mémoire sans s'écraser et que vous avez suffisamment d'espace pour continuer, ne vous laissez pas vous rendre fou.

17
progrmr

Il ne s'agit pas de la quantité de mémoire que votre application utilisée, car elle arrivera probablement même lorsque vous écrivez une application très simple qui ne dispose que d'une seule vue avec un seul bouton, en cliquant sur le bouton, puis ouvrez la caméra. J'ai testé sur iPhone 3GS, iPad 2 et iPod Touch 3G. Cela ne s'est passé que dans iPhone 3GS. J'ai trouvé que cela n'arrivera plus si vous redémarrez votre appareil avant de vous exécuter une application.

Une autre solution réelle consiste à commenter le code, [super didReceiveMemoryWarning], Dans votre mode de vueController.

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

Après beaucoup d'essai sur iPhone 3GS avec iOS 4.3.2, j'ai trouvé que la logique peut aimer cela: -> Ouvrir autant que l'application en cours d'exécution sur fond -> Présentation d'une imagePicker de UiImagePickerController, en cliquant sur "Retour" ou "Enregistrer" de ImagePicker - > ApplicationDelegate's Procédé, applicationDidReceiveMemoryWarning:(UIApplication *)application _, sera appelé -> Ensuite la méthode de Concontroller, didReceiveMemoryWarning:, Sera appelé -> TUNVIEDDIDUNLOWLOAD -> TOVORYDIDLOAD

Ensuite, vous pourriez trouver certaines opinions ont été publiées et la vue actuelle a été signalée à une inattendue.

Par défaut, [super didReceiveMemoryWarning] S'exécutera lorsque la méthode de ViewController's didReceiveMemoryWarning est invoquée. Le commentaire, et viewDidUnload: Et viewDidLoad: Les méthodes ne seront pas invoquées. Cela signifie que l'avertissement MEM a été totalement ignoré. C'est ce que nous attendions.

6
Navy

Maintenant, après avoir mis à niveau 4,0, cela arrive aussi à mon application - avant la version 3.1, il n'y avait aucun avertissement.

En fait, comme vous l'avez déjà dit, il ne devrait y avoir aucun problème. Cependant, cela provoque la vue qui vient à nouveau à charger et que ViewDidLoad est appelée. Cela gâchit mon application, puisque j'initialise la vue dans la vue ViewDidLoad - Maintenant, il est encore initialisé à nouveau - même s'il ne devrait pas le faire.

Juste comme un commentaire, cela pourrait également arriver à de nombreuses autres applications qui s'appuient sur le chargement de la vue une seule fois!

5
user387184

J'arrivais dans mon application que j'ai fait cela sur iOS 4.0 aussi. Ce n'était pas cohérent, mais la cause la plus courante créait une instance UIImagePickerController et de naviguer sur une grande photo stockée dans l'un des albums.
[.____] fixe par l'état persistant dans la méthode didReceiveMemoryWarning et en chargeant de l'état dans la méthode de la vue ViewDidLoad. Une mise en garde est de ne pas oublier d'effacer le fichier persisté de l'état dans le point correct de votre application. Pour moi, il quittait la pertinence UIViewController dans des circonstances normales.

4
DenTheMan

Je reçois l'avertissement de la mémoire lors de l'ouverture d'un uiImagePickerController aussi. Je suis aussi sur 4.01. Mais en outre, l'UIImagePickerController exécute l'animation d'obturateur de fermeture et l'étalant, avec le déclencheur fermé à l'écran.

Il semble que le comportement de l'uiimagePickerController sur les avertissements de la mémoire est de se fermer. Je pourrais renvoyer l'UIIMAGEPICKERCONTROLLER de la visualisation des parents de la méthode DidreceivemoryWarning, mais cela ferait une expérience utilisateur terrible.

Quelqu'un a-t-il vu ce problème? Y a-t-il un moyen de gérer l'avertissement de la mémoire afin que l'uiimagepickercontroller ne se ferme pas?

1
eddy

Le UIImagePickerControllerDelegate est un porc mémoire car vous capturez des actifs de mémoire élevés, que ce soit une image ou une vidéo. Donc, à partir du début, assurez-vous de spécifier les paramètres de capture moyenne, en tant que point de départ, réduisez ceci si vous n'avez pas besoin de la qualité:

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.videoQuality=UIImagePickerControllerQualityTypeMedium;

Puis après avoir capturé et utiliser ces actifs. Supprimez tous les fichiers Temp du dossier Temp d'applications. Pourrait être une étape supplémentaire obsessionnelle mais c'est une bonne habitude:

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) {
    NSError *error;
    // Attempt to delete the folder containing globalDel.videoPath
    if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) {
        NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]);
    } else {
        NSLog(@"deleted file");
    }
}

Avec ce qui précède, il nettoie le fichier créé par le délégué. Dans certains cas, si vous êtes en train de transcoder ou de créer vos propres actifs, supprimez le dossier avec ce fichier. Notez ci-dessus, je supprime la partie "Fichier: //" de la chaîne d'URL car le gestionnaire de fichiers n'aime pas:

[lastCapturedFile substringFromIndex:7]

D'autres activités à prendre en compte sont couvertes dans les différentes documents pour ce que vous faites avec cet actif - Transcodage, réduction de la taille de l'image et plus encore. Attention à ce que tout transcodage à l'aide du AVFoundation va crancer si le UIImagePickerViewController affiche.

1
elliotrock

J'ai eu du mal avec le même problème pendant quelques jours maintenant. Cependant, réinitialiser mon iPhone 4 (Effacement de la mémoire) résout le problème de sorte que ce n'est pas vraiment un problème d'application.

Il apparaît qu'un avertissement de la mémoire de niveau 1 ou 2 déclenche le délégué UIIMGPickerController pour se décharger. La même chose se produit dans mon application avec le délégué du délégué (oui, cela peut). Après l'avertissement de la mémoire cependant, il chargera le délégué (et il est délégué), ce qui entraînera une nouvelle fois que la liste ViewDidDload pour exécuter n'importe quel code qui est là.

Je ne suis pas sûr que cela ne se produise que lors de l'utilisation de l'UIMGPICKERCONNTROLLER car tout essai beaucoup de temps.

Je pourrais écrire un code supplémentaire pour empêcher le code dans la vue ViewDidLoad en vue de l'exécution tout en montrant l'UIIMGPICKERCONTROLLER, mais ce n'est pas chic, non?

Voici la nourriture pour la pensée: il se peut que vous manquiez de mémoire, car vous testez votre application. Avec certains Memoryleaks, il est très bien possible que vous travailliez à ce problème chaque fois que vous déboguez.

1
Jaap