使用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,就会抛出这个错误。
修复步骤:
把Vision实例声明为类的属性,让它的生命周期和你的类(比如ViewController)保持一致,这样就不会在异步操作完成前被释放。
在你的类顶部添加:// 作为类的属性持有,保证生命周期足够长 private let vision = Vision.vision()修改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
相关产品推荐
相关产品推荐

