UIImageWriteToSavedPhotosAlbum с malloc_error - PullRequest
1 голос
/ 09 марта 2010

У меня есть файл NIB с кнопкой. Когда я нажимаю эту кнопку, вызывается селектор setWallpaper :. Все работает как положено (изображение сохранено), за исключением ошибки, выдаваемой malloc.

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

Я установил точку останова на malloc_error_break, но я ничего не понимаю из отладчика. Я даже не мог найти объект 0x184d000. Кто-нибудь знает, почему это происходит? Я также пытался сохранить UIImage перед отправкой его в UIImageWriteToSavedPhotosAlbum, но безуспешно.

Мой код ниже:

- (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];
}

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Хорошо, после клонирования почти всего моего проекта, я понял, что проблема в OS3.0. Поменял на OS3.1 и все работает просто отлично. Спасибо за помощь, Карл!

0 голосов
/ 09 марта 2010

UIImageWriteToSavedPhotosAlbum делает сохранение асинхронно, что означает, что вы должны убедиться, что ваш UIImage остается в течение этого времени Вы передаете ему автоматически выпущенный объект, так что когда-нибудь он падает, пытаясь сохранить. Измените setWallpaper:, чтобы отправить retain на UIImage. Затем вы можете release или autorelease это в вашем обратном вызове, чтобы избежать утечки. Пример:

Измените строку, которая получает изображение:

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

Затем добавьте

[image release];

в обратном вызове.

...