Сохранение фотографии в библиотеке более одного раза с использованием 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(), Вы не делали ничего подобного здесь, так что это не ваш объект для освобождения. Так что просто обрежьте эти строки, перестаньте делать неправильное управление памятью, и все будет хорошо.

Другие вопросы по тегам