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

MacOS应用中UIActivityViewController的completionWithItemsHandler未调用如何解决

根因分析
  • 该问题本质是macOS(UIKit for Mac/Catalyst)平台下UIActivityViewController的生命周期持有逻辑与iOS/iPadOS不一致导致的内存提前释放问题
  • 原代码中UIActivityViewController实例仅在shareImage()方法内作为局部变量存在,方法执行结束后就没有强引用持有该实例:
    • iOS/iPadOS平台下,被present的视图控制器会被系统自动强持有直到dismiss完成,因此回调可以正常触发
    • macOS平台下系统不会额外持有Catalyst模式下的UIActivityViewController实例,实例在方法执行结束后立刻被ARC回收,自然无法触发completionWithItemsHandler回调,同时产生Scene destruction request failed with error: (null)的异常日志
修复方案

你标注的两行新增代码就是正确的修复逻辑,核心是用类的存储属性强持有分享控制器实例,保证它在回调执行完成前不会被释放:

  1. 在ViewController类中声明可选类型的UIActivityViewController存储属性,作为强引用持有的容器
private var activity: UIActivityViewController?
  1. 在shareImage()方法中完成UIActivityViewController的配置后,将局部实例赋值给类的存储属性,延长实例生命周期
self.activity = activity
  1. 补充优化:建议在回调中添加[weak self]避免循环引用,同时回调执行完成后将存储属性置空,释放不必要的内存占用:
activity.completionWithItemsHandler = { [weak self] activity, success, items, error in
    self?.activityComplete()
    self?.activity = nil // 回调执行完毕后释放实例
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:06:03