我试图设置矩形请求的属性。
我试图设置最小大小,纵横比和其他,但得到以下错误。
致命错误:试图读取无主引用,但对象已被解除分配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
,其中vcA
是ViewControllerA
的实例,而vcB
是ViewControllerB
的实例。vcA
和vcB
永远不会被释放,因为由于它是一个属性,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/