什么是 Swift 中的部分应用闭包#1

Dee*_*rma 21 xcode crash-reports ios swift swiftui

我试图理解此崩溃报告,但无法理解,因为函数“applySettings()”不是从 init() 调用的,如崩溃报告中所示。Swift 中的“部分申请closure#1”是什么?

在此输入图像描述

这是 init() 函数所需的代码。

   public override init()
{
    super.init()
    
    discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera, AVCaptureDevice.DeviceType.builtInDualCamera, AVCaptureDevice.DeviceType.builtInTelephotoCamera, AVCaptureDevice.DeviceType.builtInDualWideCamera,
            AVCaptureDevice.DeviceType.builtInTripleCamera,
            AVCaptureDevice.DeviceType.builtInUltraWideCamera], mediaType: AVMediaType.video, position: .unspecified)
    
    detectLenses()
    
    checkForDeviceAuthorization()
    
    setZoomParams()
    
    sessionQueue.async { [unowned self] in
        self.configureSession()
    }

}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 12

@丹尼尔卡普兰

我正在寻找标题的答案(就像OP一样),而不是堆栈跟踪的原因。答案必须解释“部分申请关闭#1”的含义。

一些背景知识(从这里开始,为了更深入地了解数学):

在此输入图像描述

那么这是怎么回事呢?

sessionQueue.async { [unowned self] in
    self.configureSession()
}
Run Code Online (Sandbox Code Playgroud)

这里我们直接闭包调用函数,Swift 编译器会识别这一点并进行柯里化,即。不是调用函数的函数,而是解包闭包并注入到async内部函数的直接调用中,例如

sessionQueue.async(execute: CapturePipeline.configureSession(self))
Run Code Online (Sandbox Code Playgroud)

但是将其与源代码调试信息结合起来应该保留有关此简化的信息,因此他们将其标记为部分应用闭包#(其中 N 只是父函数中现有闭包的有序数量)。

要修复该崩溃,如前所述,最好的方法init完全删除该部分并在创建完成后调用。更糟糕的是使用[weak self].

  • 嗯,抱歉,我不明白,主要是两个代码示例之间的段落。 (2认同)

mat*_*att 6

你不能在init. 我们试图返回初始化的对象;这就是你应该在这里做的一切。当完全存在时,其他所有事情都应该在后续配置调用中发生self

  • 这是一个很好的观察。但这是事故报告中的罪魁祸首吗? (3认同)
  • 我坚持我的答案。 (2认同)