Сохранение фотографии в библиотеке более одного раза с использованием ALAssetsLibrary вызывает сбой
У меня есть метод, который сохраняет фотографию в библиотеку фотографий пользователя. Этот код отлично работает при первом сохранении фотографии в библиотеке, но если вы попытаетесь сохранить его во второй раз, приложение вылетит.
Вот метод:
- (void)saveToLibray
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Request to save the image to camera roll
[library writeImageToSavedPhotosAlbum:[self.image CGImage] orientation:(ALAssetOrientation)[self.image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:nil message:@"Could not save photo to your library. Please enable Halfsies in Settings > Privacy > Photos." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
CGImageRelease([self.image CGImage]);
} else if (!error) {
UIAlertView *librarySaveSuccessAlertView = [[UIAlertView alloc]initWithTitle:@"Success!" message:@"Your finished halfsie was successfully saved to your photo library!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[librarySaveSuccessAlertView show];
CGImageRelease([self.image CGImage]);
}
}];
}
Я убедился, чтобы выпустить CGImage
и я тоже жду librarySaveSuccessAlertView
чтобы показать на экране, нажмите кнопку ОК (cancelButtonTitle
), а затем я пытаюсь сохранить во второй раз.
Во второй раз приложение всегда вылетает.
Это происходит потому, что библиотека может обнаружить дубликаты фотографий, или это что-то еще?
РЕДАКТИРОВАТЬ: подробности аварии
На строке, выделенной зеленым цветом после сбоя приложения, написано:
Thread 1: EXC_BAD_ACCESS(code=1, address=0x657471ef)
РЕДАКТИРОВАТЬ 2: Хорошо, теперь я понимаю, что это наиболее вероятно, потому что я пытаюсь отправить сообщение освобожденному объекту. Я запутался в том, как я должен справиться с этим. Хотя я выпускаю CGImage
данные self.image
, Я все еще должен иметь доступ к нему снова при втором сохранении правильно?
1 ответ
Как вы уже подозреваете (хорошо сделано), проблема заключается в следующей строке:
CGImageRelease([self.image CGImage])
От вас требуется освободить объект типа CG, если и только если вы вызвали Create
или же Copy
способ получить его. Например, вы могли бы получить этот CGImage, вызвав функцию CGImageCreate()
, Вы не делали ничего подобного здесь, так что это не ваш объект для освобождения. Так что просто обрежьте эти строки, перестаньте делать неправильное управление памятью, и все будет хорошо.