delegate为什么要用weak或者assign而不用strong

a创建对象b,b中有C类对象c,所以a对b有一个引用,b对c有一个引用,a.b引用计数分别为1,1。当c.delegate = b的时候,实则是对b有了一个引用,如果此时c的delegate用strong修饰则会对b的值内存引用计数+1,b引用计数为2。当a的生命周期结束,随之释放对b的引用,b的引用计数变为1,导致b不能释放,b不能释放又导致b对c的引用不能释放,c引用计数还是为1,这样就造成了b和c一直留在了内存中。

而要解决这个问题就是使用weak或者assign修饰delegate,这样虽然会有c仍然会对b有一个引用,但是引用是弱引用,当a生命周期结束的时候,b的引用计数变为0,b释放后随之c的引用消失,c引用计数变为0,释放。

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

推荐阅读更多精彩内容

  • 本文逻辑图: 在知道他们区别之前,我们首先要知道NSObject对象的赋值操作做了哪些操作。 A=C其实是在内存中...
    壮了个壮阅读 20,876评论 40 148
  • 始终觉得,好记性不如烂笔头,写博客还是非常有必要的,不但可以记录自己学习到的知识,也还可以和别人一起分享。最重要的...
    小的牙牙菜阅读 1,515评论 0 2
  • 现在的人,越来越讲实用。 是与非,对与错,对讲究实用的人来说,不值一提,付之一笑。 因为在他们心里,没有是非对错。...
    千秋笔阅读 186评论 0 2
  • 看着镜子里,大臂上,刚刚形成的那条触目惊心的伤疤,深深的叹了口气。也许明年,它会变得浅一点吧。也许两年后,它会看不...
    童_小_童阅读 197评论 0 0
  • 1、童话故事《青蛙王子》大家应该都看过,王子被施了巫术变成了一只青蛙,只能住在幽暗森林里的深潭里。有一天国王最美丽...
    当老师课代表阅读 606评论 0 0