UIImageWriteToSavedPhotosAlbum con malloc_error
Domanda
Ho un file NIB con un pulsante. Quando clicco questo pulsante, il setWallpaper: selettore viene chiamato. Tutto funziona come previsto (l'immagine viene salvata), excepté dall'errore lanciata da malloc.
malloc: *** error for object 0x184d000: pointer being freed was not allocated ***
set a breakpoint in malloc_error_break to debug
Ho impostato un punto di interruzione malloc_error_break, ma io non capisco niente dal debugger. Non riuscivo nemmeno a trovare la 0x184d000 oggetto. Qualcuno sa perché succede questo? Avevo provato anche a mantenere l'UIImage prima di inviarlo al UIImageWriteToSavedPhotosAlbum, ma senza successo.
Il mio codice è qui sotto:
- (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];
}
Soluzione
Ok, dopo la clonazione quasi tutto il mio progetto, mi sono reso conto che il problema viene da OS3.0. Cambiato in OS3.1 e tutto funziona bene. Grazie per l'aiuto, Carl!
Altri suggerimenti
UIImageWriteToSavedPhotosAlbum
fa il risparmio in modo asincrono, il che significa che è necessario assicurarsi che il proprio UIImage
rimane intorno per tutto quel tempo. Si sta passando un oggetto autoreleased, quindi è schiantarsi qualche tempo là fuori cercando di fare il salvataggio. Cambiare setWallpaper:
per inviare retain
al UIImage
. Poi si può release
o autorelease
nel vostro callback per evitare perdite. Un esempio:
Modificare la riga che ottiene l'immagine:
UIImage *image = [[UIImage imageNamed:@"wallpaper_01.png"] retain];
Quindi aggiungere
[image release];
nel callback.