我试图设置矩形请求的属性。
我试图设置最小大小,纵横比和其他,但得到以下错误。
致命错误:试图读取无主引用,但对象已被解除分配2018-08-13 16:08:09.081049+0100应用程序[4000:1277980]致命错误:试图读取无主引用,但对象已被解除分配

func performVisionRequest(image: CGImage, orientation: CGImagePropertyOrientation) {

    DispatchQueue.global(qos: .userInitiated).async {
        do {
            let imageRequestHandler = VNImageRequestHandler(cgImage: image, orientation: orientation, options: [:])
            try imageRequestHandler.perform(
                [VNDetectRectanglesRequest(completionHandler:{ req, err in
                    self.rectanglesRequest(request:req, error:err)

                })]
            )
        } catch let error as NSError {
            self.sliceCompletion([UIImage]())
            print("Failed to perform vision request: \(error)")

        }
    }
}

func rectanglesRequest(request: VNRequest, error: Error?) {
    if let err = error as NSError? {
        noRect = true
        var slices = [imageNo]
        self.sliceCompletion(slices as! [UIImage])
        slices = []
        print("Failed during detection: \(err.localizedDescription)")
        return
    }
    unowned let rectanglesRequestSet = VNDetectRectanglesRequest()

    rectanglesRequestSet.minimumSize = 0.07
    rectanglesRequestSet.minimumAspectRatio = 0.2
    rectanglesRequestSet.maximumAspectRatio = 0.3
    rectanglesRequestSet.quadratureTolerance = 22.0

最佳答案

在这里,将rectanglesRequestSet标记为unowned是不好的,因为它会导致在您可以使用它之前释放它,并且当您尝试向已释放的unowned对象发送消息时,您将收到一个崩溃,这解释了您收到的消息:
试图读取无主引用,但对象已被释放
unowned用于中断当类的属性持有对类本身的引用(通常通过闭包)时发生的保留周期。例如:

class ViewControllerA: UIViewController {
    let viewControllerB = UIViewControllerB()

    override func viewDidLoad() {
        super.viewDidLoad()
        viewControllerB.onSelect = {
            self.onSelection()
        }
    }

    func onSelection() {
        // do something
    }
}

class ViewControllerB: UIViewController {
    var onSelect: (() -> Void)?
}

例如,上面的代码创建了一个retain循环,即vcA>vcB>onSelect>vcA,其中vcAViewControllerA的实例,而vcBViewControllerB的实例。vcAvcB永远不会被释放,因为由于它是一个属性,vcA持有对vcB的引用。并且,vcB通过vcA闭包中的变量捕获持有对onSelect的引用。这是因为为了让闭包在将来执行代码,它们必须持有对闭包中使用的所有对象的引用,在示例中vcA是唯一使用的对象,因此闭包持有对它的引用,而vcB持有对闭包的引用。要防止此保留周期:
viewControllerB.onSelect = { [unowned self]
    self.onSelection()
}


viewControllerB.onSelect = { [weak self]
    self?.onSelection()
}

将导致闭包无法捕获vcA这意味着将没有保留周期。使用weak比使用unowned更安全。闭包不能保证未捕获的对象在执行时会在weak附近,nil在某种程度上允许这样的对象在unowned中,nil是规定它不会在中,并指示程序在它是时崩溃。

关于ios - 在矩形请求上设置属性。 iOS,Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51825489/

10-12 01:16