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

Swift:独立类实现Delegate赋值后为nil,如何解决?

解决独立Delegate类赋值后为nil的问题

嘿,这个问题我之前踩过同款坑,咱们来理清楚原因和解决办法:

为什么会出现Delegate为nil的情况?

你直接写someView.delegate = MapViewAnnotationDelegate()的时候,这个MapViewAnnotationDelegate实例只是个临时对象——绝大多数UI组件的delegate属性都是弱引用(weak),这是苹果为了避免循环引用特意设计的规则。所以当你把临时实例赋值给弱引用的delegate后,没有任何其他强引用持有这个实例,ARC(自动引用计数)会立刻把它释放掉,自然someView.delegate就变成nil了。

解决办法:给Delegate实例加一个强引用持有者

你只需要在控制器里添加一个强引用属性来保存这个Delegate实例,让它有个“固定落脚点”就行:

步骤1:在控制器中声明强引用属性

class YourViewController: UIViewController {
    // 用let或者var声明一个强引用的Delegate实例
    private let annotationDelegate = MapViewAnnotationDelegate()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 赋值给someView的delegate
        someView.delegate = annotationDelegate
    }
}

步骤2:你的独立Delegate类保持不变

class MapViewAnnotationDelegate: NSObject, SomeDelegate {
    // 实现Delegate协议要求的方法
    func requiredDelegateMethod() {
        // 你的业务逻辑代码
    }
}

额外说明

你提到Objective-C里用strong修饰Delegate,那是特殊场景下的变通做法,但在Swift中,我们还是应该遵循苹果的设计规范:UI组件的delegate用弱引用,通过外部强引用来持有Delegate实例,这样既避免了循环引用导致的内存泄漏,又能保证Delegate实例不会被提前释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:35:26