You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Firebase MLKit进行OCR时遇报错:Failed to run text detector because self is nil

解决Firebase MLKit OCR识别报错:Failed to run text detector because self is nil

这个错误的核心原因很明确:你的Vision实例被提前释放了。

ML Kit的detect(in:completion:)是异步操作,它会在后台线程处理图片,再通过闭包返回结果。如果你的Vision实例是在detectTexts()函数里创建的局部变量,函数执行完毕后这个局部变量就会被系统销毁,当异步回调触发时,文本检测器内部依赖的Vision实例已经变成nil,就会抛出这个错误。

修复步骤:

  1. 把Vision实例声明为类的属性,让它的生命周期和你的类(比如ViewController)保持一致,这样就不会在异步操作完成前被释放。
    在你的类顶部添加:

    // 作为类的属性持有,保证生命周期足够长
    private let vision = Vision.vision()
    
  2. 修改detectTexts函数,使用类属性的Vision实例创建检测器:

    func detectTexts() {
        let image = #imageLiteral(resourceName: "testocr")
        // 使用类属性的vision创建文本检测器
        let textDetector = vision.textDetector()
        let visionImage = VisionImage(image: image)
        
        textDetector.detect(in: visionImage) { (features, error) in
            guard error == nil, let features = features, !features.isEmpty else {
                let errorString = error?.localizedDescription ?? "No results returned."
                print("Text detection failed with error: \(errorString)")
                return
            }
            // 识别成功后的处理逻辑
            print("Detected text has: \(features.count) blocks")
            let resultText = features.map { "Text: \($0.text)" }.joined(separator: "\n")
            print(resultText)
        }
    }
    

额外检查点:

  • 确保你已经正确配置Firebase项目,并且在Podfile中引入了ML Kit的文本识别依赖:
    pod 'Firebase/MLVision'
    pod 'Firebase/MLVisionTextModel'
    
    执行pod install更新依赖后再重新运行项目。

这样修改后,Vision实例会一直被类持有,直到类本身被销毁,异步回调执行时检测器就能正常访问到所需的实例了。

内容的提问来源于stack exchange,提问作者NITESH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:49