自从接触了swift 之后,Closure 算是用的最多的东西了,为了避免循环引用,一直喜欢在Closure里面 使用 [unowned self] in这种方式,来避免这个问题。
然而
当页面存在网络请求的时候!
在这里,我使用了Alamofire 和 MJRefresh 来请求数据和控制页面刷新,且,tableView 被我抢解包了(这里这个tableView是必然存在的。。。页面开始我就创建了它)
然后问题来了:当网络情况差的时候,页面被销毁,但是网络请求并没有被取消,然后网络数据下来之后,继续执行了Closure,此时程序崩溃,因为self已经不在了。
参考了Swift:Weak 和 Unowned之后,
解决方案:
将[unowned self] 改为了 [weak self] 避免强制解包
不靠谱的分析
大概是unowned 捕获的对象不是Option 类型的对象,unowned 必须要求对象必须提前创建, 并和Closure 拥有相同的生命周期才可以有效的避免强制解包!