循环引用的坑
并不是任何的block都不可以引用self,所以不要遇到所有的block都使用weak self
- 设置delegate的时候容易造成循环引用,这也是几乎所有人都注意到的地方
- 在子视图中引用父视图的时候也会造成循环引用,这个和设置delegate类似
- block中会造成循环引用,这是最恶心的地方,对于我来说是最难理解的地方,至今仍有很多不理解的
- NSTimer会造成循环引用,因为一般的定时器都是类拥有的,而且设置的时候target的对象也是该类,这里要注意的就是当销毁的时候,最好是手动控制。销毁的时候,将属性设置为空
我主要想记录的还是block所造成的循环引用
所谓的循环引用无非就是在引用计数的时候,两个对象,或者多个对象的引用造成了一个循环圈,导致内存无法释放的玩意。所有如果从根本的原因去解决的话,将会很有成就感。哥再也不用见到一个block都写一堆weakself来变来变去了。
不明白其原理说到底的原因还是因为对操作系统,或者底层知识不是很了解。
比如类到底是一个什么玩意。它的成员变量的内存是怎么分配的。方法呢?
属性中的block和方法中的回调block到底有什么区别
传值的时候,到底是怎么传的。传值和传址到底有什么区别。
根据今天的研究,自我感觉对内存的分配的概念更理解了点。操作系统还是很重要的。早日将深入理解计算机系统啃完更重要。
- 好吧,研究发现。方法中持有的block,只要不被该类持有。也就是只是该方法所持有的block。一般是不会造成循环引用的。
因为一般这样的block的生命周期就是该方法的区间。当该方法结束的时候,block也就被释放了。所有一般是不会造成循环引用滴啦。
如果你的block被类持有了,那么呵呵,你自己看着办吧。 - 一般的情况下,只要自己不是太作,在方法里声明的临时对象,一般也不会造成循环引用。因为这样的对象并没有被类持有。所有该对象的block只要不引用该对象,就不会造成循环引用。引用该对象的属性也是引用该对象啦。也就是说这个地方放心的去引用self吧。木问题啦。
- 让我很恶心的东西来了,为什么同样的是一个block,一个带参数,一个不带参数。如果不带参数。如果在这两个block里面引用该对象的话,哪肯定会造成循环引用的啦。但是呢,如果你换个思路,把该对象当做参数传进去的话,就不会造成循环引用啦。难道是因为block的参数也是copy的吗?但是为什么参数也是可以释放的呀。难道是引用传的是值类型吗?可是为什么引用类型当参数的时候也是木问题的啊。理解不了呀,以后再研究吧。慢慢来,循环引用,内存管理真是一个大坑呀。大大的坑