2009-09-19 9 views
1

Contrôleur uiimagepickerview créant des fuites de mémoire dans l'iphone - pourquoi? Essayez de mettre en œuvre le contrôleur de vue du sélecteur d'image ui dans votre application. & Déboguez-le. Vous trouverez des fuites de mémoire dans votre application. Pourquoi le contrôleur de vue du sélecteur d'image ui crée des fuites de mémoire.contrôleur uiimagepickerview créant des fuites de mémoire dans l'iphone - pourquoi?


-(void)addPhotos:(id)sender 
{ 
    if(imagePickerController==nil){ 
      imagePickerController=[[UIImagePickerController alloc]init]; 
      imagePickerController.delegate=self; 
      imagePickerController.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
     imagePickerController.allowsImageEditing=YES; 
      imagePickerController.navigationBar.barStyle=UIBarStyleBlackOpaque; 
    } 
[self.navigationController presentModalViewController:imagePickerController animated:YES]; 
} 

dealloc de mon contrôleur de vue.


- (void)dealloc { 
if(PhotoDateArray!=nil)[PhotoDateArray release]; 
if(imagePickerController!=nil) [imagePickerController release]; 
if(objDetail!=nil) [objDetail release]; 
if(Picimage!=nil) [Picimage release]; 
if(mySavePhotoController!=nil) [mySavePhotoController release]; 
if(LoadingAlert!=nil); 
[super dealloc]; 
} 

lien vidéo expliquant comment je reçois la fuite de mémoire en elle ..

http://www.yourfilelink.com/get.php?fid=508534

+1

Pouvez-vous poster votre code dans la façon dont vous appelez le uiimagepickerview – coneybeare

+0

@coneybeare - bien monsieur. –

+0

s'il vous plaît regarder la vidéo. Il fera la clarification. Je suis en train d'éditer la question maintenant –

Répondre

2

Même si vous avez la vérification nulle, il est toujours possible de fuir la mémoire. Je pense que ce qui se passe ici, c'est que vous appelez alloc/init plusieurs fois, mais seulement une fois. Je devine que est câblé jusqu'à un certain clic de bouton, dealloc ne serait appelé qu'une seule fois lorsque le délégué tente de détruire. Cela crée une situation comme celle-ci:

  • bouton cliquez sur
    • alloc/init
  • bouton
  • cliquez
    • alloc/init (fuite de mémoire sur le premier sélecteur de alloc'd)
  • fermer la fenêtre
    • dealloc (sélecteur deuxième alloc'd gratuit)

Une meilleure façon peut-être la manière dont Apple il fait dans les exemples PhotoLocations et iPhoneCoreDataRecipes:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
imagePicker.delegate = self; 
[self presentModalViewController:imagePicker animated:YES]; 
[imagePicker release]; 

ensuite écouter les messages didFinishPickingImage et imagePickerControllerDidCancel à votre délégué et un appel à [self dismissModalViewControllerAnimated:YES]; dans les deux endroits devrait suffire.

+0

J'ai téléchargé des exemples de codes de vos liens donnés. même dans les échantillons de pommes fuites de mémoire. S'il vous plaît regarder la vidéo. Il fera la clarification. Je suis en train d'éditer la question maintenant –

+0

Je ne peux pas insister assez sur ce point, si vous avez trouvé une fuite dans le SDK, signalez le bug pour qu'il soit corrigé – slf

1

Je ne sais pas sur le reste du code, mais avez-vous jamais communiqué ?

[imagePickerController release] 
+0

Monsieur - j'ai sûrement publié cet objet. La fuite est de type ===== + [UIImagePickerController _loadPhotoLibraryIfNecessary] –

+2

Eh bien, Apple n'est pas parfait et ils ont parfois un code qui fuit. Si vous faites de votre mieux et qu'il fuit toujours à l'interne, il est temps de concentrer vos efforts sur quelque chose que vous pouvez vraiment changer. – coneybeare

+1

également, assurez-vous que si vous avez trouvé une fuite dans les internes de la pomme, soumettre un bug par radar afin qu'ils le répareront. Ils travaillent les bogues qui sont signalés plus d'abord, et la photothèque est largement utilisée – slf

1

UIImagePickerController charges et initialise la première fois PhotoLibrary.framework il est montré. Cette mémoire ne sera pas récupérée tant que votre application n'est pas fermée.

(le code affiché ne semble pas avoir des fuites en l'état, mais cela ne signifie pas qu'il ne sera pas interagir avec le reste de votre demande d'une manière qui les provoque)

+0

J'ai téléchargé des exemples de codes de vos liens donnés. même dans les échantillons de pommes fuites de mémoire. S'il vous plaît regarder la vidéo. Il fera la clarification. Je suis en train d'éditer la question maintenant –

1

Je peux expliquer cela parce que j'avais le même problème.Ne pas tester la mémoire sur le simulateur! Si vous testez le code pomme sur un périphérique, le problème de mémoire disparaît. J'avais une fuite d'allocation de mémoire que j'ai trouvée dans Instruments. Tout ce que je faisais était d'ouvrir et de fermer le sélecteur d'image (ouvrir/annuler) et d'utiliser le code Apple, mon code et le code d'autres personnes, tout comme le vôtre ci-dessus. Tous affichaient une augmentation et une augmentation à chaque fois, comme si le sélecteur n'était pas libéré. Si vous essayiez de le libérer, il tomberait en panne (sur relâché).

Je trouve une page web très utile qui essentiellement a déclaré:

« Cela ne se produit pas lors du test sur l'appareil »

donc je suis passé du simulateur et conduit les tests sur l'appareil. Lo & il n'y avait pas d'augmentation d'allocation et il se comportait normalement. Ceci est cependant totalement diabolique et maintenant nous ne pouvons plus faire confiance au simulateur pour faire un travail fiable.

Je veux ajouter cela pour sauver les gens, le temps, la douleur et la perplexité de se demander ce qui se passe!

+0

Je vois toujours des fuites de mémoire lors de l'exécution sur mon téléphone, tout comme vous dites, en ouvrant et en annulant. C'est assez horrible. Voici mon thread SO: http: //stackoverflow.com/questions/6554225/uiimagepickercontroller-memory-leak – Watson

Questions connexes