循环引用的坑

循环引用的坑

并不是任何的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的吗?但是为什么参数也是可以释放的呀。难道是引用传的是值类型吗?可是为什么引用类型当参数的时候也是木问题的啊。理解不了呀,以后再研究吧。慢慢来,循环引用,内存管理真是一个大坑呀。大大的坑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值