xcode编译器是如何发现代码中出现了”循环引用”的

场景

有时候写代码会出现这样的警告 Capturing 'self' strongly in this block is likely to lead to a retain cycle。意思是说在 block 里面写了强引用的 self 可能会导致"循环引用"。

什么是循环引用

这个我不打算细说了,网上大把关于循环引用的文章,自己上谷歌去百度一下就知道了。大概说一下就是 iOS 的 ARC 内存管理方式导致的。一个对象(Controller,View,Model等等都是对象)如果被 strong 指针指着,ARC 是不会去释放它的,如果被 weak 指针指着,ARC 会把它释放掉的。

按照这个规则,那么问题来了,看下面几个例子。

循环引用.png

编译器如何发现循环引用

用了图论中的拓扑排序,拓扑排序是不能排有环的图的,所以用它来对一个图排序,如果排序失败了就表示出现了环(即发生了循环引用),排序成功就表示没有环。

今天又看了一遍拓扑排序的定义,以前上离散数学的时候听过,现在有点忘了,百度百科的定义是

由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

举个例子说清偏序,全序

拓扑排序过程比较直观了,步骤如下:
1.遍历图中入度为 0 的节点,全部加入到栈中。(上图的 a)
2.从栈中拿出一个节点,把它指向的节点的入度全部减一。
3.重复1,2步骤直到栈空。

如果图中的点全都被访问过,表示没有环,如果还有无法访问的节点,表示出现了环,排序失败。即出现了“循环引用”的情况。

最后发个以前写的拓扑排序的代码(下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,605评论 0 12
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,292评论 30 472
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 13,320评论 10 69
  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 6,927评论 2 26
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 9,614评论 2 19