最近几天一直再看各种demo ,进行各种封装。今天有幸看到一个 [weak self] 的block 用法感觉很是奇怪!心起百度了一下了 承蒙指点 小记一下心得:
这几个说的个人觉得比较好:
这是我们不希望看到的,因为此时 A 和 B 两个类的实例都不能被 deinit
因为我们在 var a前面加上了 weak,就是向编译器表明我们不希望持有 a
至于题主所问的闭包中的情况,其实道理是一样的,就是有无循环引用的问题
---------------至此问题回答完毕,以下为延伸---------------
显然,标记为 weak 的成员是个 Optional 值,因为它引用的内容可能被释放掉(deinit),那时它会从原来的值自动变成 nil,这也是 weak 友好的地方。
相对应的,还有一个不太友好的是 unowned,这个关键字在 Swift 中像是之前 OC 里面的 unsafe_unretained,它不会变成 nil,而是会保持持有引用的状态,即便在引用的内容被释放掉之后,它也会保持一个无效的引用。
我跟大家分享想唐巧在YTKNetWorking里怎么处理这件事的
YTKNetWorking的block是不需要weak引用的,
项目地址在这:yuantiku/YTKNetwork · GitHub
唐巧在文档中也说明了,可以在block里直接用self
原理其实也很简单,在网络请求结束的时候,调用了这个方法把block置空,就打破了循环引用
参考地址:https://www.zhihu.com/question/34593410