Swift 4:使用AVFoundation获取线程1:EXC_BAD_ACCESS错误

时间:2018-06-09 12:39:58

标签: ios swift avfoundation swift4

学习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:

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

在我的imagePreviewViewController.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 :(得分:0)

AVCapturePhoto.cgImageRepresentation()返回非托管CGImage参考。如果您在takeRetainedValue()上使用它,则会消耗不平衡的保留,这可能导致它过早发布以及随后的EXC_BAD_ACCESS。尝试使用takeUnretainedValue()