2010-03-08 1 views
1

J'ai un fichier NIB avec un bouton. Lorsque je clique sur ce bouton, le sélecteur setWallpaper: est appelé. Tout fonctionne comme prévu (l'image est sauvegardée), excepte par l'erreur lancée par malloc.UIImageWriteToSavedPhotosAlbum avec malloc_error

malloc: *** error for object 0x184d000: pointer being freed was not allocated *** 
set a breakpoint in malloc_error_break to debug 

J'ai mis un point d'arrêt à malloc_error_break, mais je ne comprends rien du débogueur. Je ne pouvais même pas trouver l'objet 0x184d000. Est-ce que quelqu'un sait pourquoi cela se passe-t-il? J'avais aussi essayé de conserver l'UIImage avant de l'envoyer à UIImageWriteToSavedPhotosAlbum, mais sans succès.

Mon code est ci-dessous:

- (IBAction)setWallpaper:(id)sender { 
    UIImage *image = [UIImage imageNamed:@"wallpaper_01.png"]; 
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
} 

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { 
    UIAlertView *alertView = [[UIAlertView alloc] 
      initWithTitle:NSLocalizedString(@"Galo!!!",@"Saved image message: title") 
       message:NSLocalizedString(@"Now, check your \"saved photos\" group at \"photos\" app in your iPhone and select the actions menu > set as wallpaper.",@"Saved image message") 
       delegate:nil 
     cancelButtonTitle:NSLocalizedString(@"OK",@"OK Button") 
     otherButtonTitles:nil]; 
    [alertView show]; 
    [alertView release]; 
} 

Répondre

2

Ok, après avoir cloné presque tout mon projet, j'ai réalisé que le problème venait de OS3.0. Changé à OS3.1 et tout fonctionne très bien. Merci pour l'aide, Carl!

0

UIImageWriteToSavedPhotosAlbum-ce que l'économie de manière asynchrone, ce qui signifie que vous devez vous assurer que vos séjours UIImage autour de tout ce temps. Vous lui passez un objet autoreleased, donc il s'écrase quelque part en essayant de faire l'économie. Changez setWallpaper: pour envoyer retain au UIImage. Ensuite, vous pouvez release ou autorelease dans votre rappel pour éviter les fuites. Un exemple:

Modifier la ligne qui obtient l'image:

UIImage *image = [[UIImage imageNamed:@"wallpaper_01.png"] retain]; 

ajouter ensuite

[image release]; 

dans le rappel.

+0

Je l'ai fait ... et toujours obtenir la même erreur ... En passant, je reçois deux messages d'erreur du malloc. Les deux sont exactement les mêmes. Maintenant, j'ai créé un projet vide, et copié mon ViewController + NIB et ça a bien fonctionné là ... Je vais vérifier tout cadre ou lib ajouté au projet provoque un bug ... –

Questions connexes