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
相关产品推荐
相关产品推荐

