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

Xcode12中UIImagePickerController代理didFinishPickingMediaWithInfo未触发

问题分析与解决方案

这问题我之前踩过一模一样的坑!核心原因是ARC自动引用计数机制下,你的ImagePicker对象被提前释放了,导致代理方法根本找不到响应的对象。

为什么断点时能正常工作?

当你加断点暂停程序时,ImagePicker对象的生命周期被人为拉长了(程序暂停期间ARC不会触发释放逻辑),所以代理还能正常接收回调;一旦移除断点,程序正常运行时,如果ImagePicker是局部变量,方法执行完毕后就会被ARC立即回收,此时UIImagePickerController的代理已经变成nil,自然不会触发didFinishPickingMediaWithInfo方法。

推测你的调用场景

你大概率是在ViewController的某个方法里创建了局部的ImagePicker实例,类似这样:

func openImagePicker() {
    let picker = ImagePicker()
    picker.present(presentationController: self) { pickedImage in
        // 处理选中的图片
    }
}

这里的picker是局部变量,方法执行完就会被ARC释放,后续图片选择完成时,根本找不到代理对象来触发回调。

解决方案:延长ImagePicker的生命周期

把ImagePicker声明为调用它的ViewController的属性,让VC持有它,直到图片选择流程结束后再手动释放:

  1. 在你的ViewController中添加属性:
// 用可选类型,方便用完后置空释放
private var imagePicker: ImagePicker?
  1. 修改调用代码:
func openImagePicker() {
    imagePicker = ImagePicker()
    imagePicker?.apiKey = "你的API密钥"
    imagePicker?.present(presentationController: self) { [weak self] pickedImage in
        // 处理选中的图片逻辑
        if let selectedImage = pickedImage.image {
            // 比如显示图片、上传等操作
        }
        // 流程结束后置空,释放ImagePicker对象
        self?.imagePicker = nil
    }
}

额外验证点

你代码里的pickerController.delegate = self设置是没问题的,只要self(也就是ImagePicker实例)还活着,代理就能正常响应。Xcode12之后ARC的优化可能更严格,之前Xcode11下可能因为某些延迟释放的巧合没暴露这个问题,现在就显现出来了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:02:36