Swift 4: Получение потока 1: ошибка EXC_BAD_ACCESS с AVFoundation - PullRequest
0 голосов
/ 09 июня 2018

Изучаем Swift 4 и AVFoundation и сталкиваемся с ошибкой при нажатии кнопки «Сфотографировать», выбрасывая 'Thread 1: EXC_BAD_ACCESS (code=1, address=0x596bbeb8)' вместо того, чтобы перейти к контроллеру предварительного просмотра, чтобы показать только что захваченное изображение.

(Рад предоставить больше кода, просто попытался извлечь то, что, по моему мнению, может быть уместным, чтобы вопрос был как можно более коротким: D)

В моем ViewController.swift:

При нажатии кнопки «Сделать снимок» она называется функцией takepicture ().

func takePicture() {
    let settings = AVCapturePhotoSettings()
    cameraCaptureOutput?.capturePhoto(with: settings, delegate: self) 
}

Затем для делегата:

extension ViewController : AVCapturePhotoCaptureDelegate {

    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

        if let unwrappedError = error {
            print(unwrappedError.localizedDescription)
        } else {
            let imageCaptured = photo.cgImageRepresentation()!.takeRetainedValue()
            let finalImage = UIImage(cgImage: imageCaptured)
            displayCapturedPhoto(capturedPhoto: finalImage)
        }
    } 
}

Функция displayCapturedPhoto():

func displayCapturedPhoto(capturedPhoto : UIImage) {
    let imagePreviewViewController = storyboard?.instantiateViewController(withIdentifier: "imagePreviewViewController") as! imagePreviewViewController
    imagePreviewViewController.capturedImage = capturedPhoto
    navigationController?.pushViewController(imagePreviewViewController, animated: true)
}

В моем изображенииPreviewViewController.swift:

var capturedImage : UIImage?

@IBOutlet weak var capturedImageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    capturedImageView.image = capturedImage

    // Do any additional setup after loading the view.
}

Ошибка Thread 1: EXC_BAD_ACCESS (code=1, address=0x596bbeb8) возникает на capturedImageView.image = capturedImage

Может кто-нибудь указать мне правильное направление, где я мог ошибиться здесь?

1 Ответ

0 голосов
/ 14 апреля 2019

AVCapturePhoto.cgImageRepresentation() возвращает неуправляемую ссылку CGImage.Если вы takeRetainedValue() на нем, вы потребляете несбалансированное удержание, что может привести к его досрочному освобождению и последующему EXC_BAD_ACCESS.Попробуйте takeUnretainedValue() вместо.

...