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];
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top