美文网首页
delegate使用weak修饰的原理

delegate使用weak修饰的原理

作者: FunkyRay | 来源:发表于2017-12-02 16:26 被阅读15次
  • weak修饰的属性不被所属对象持有,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。
    assign修饰的属性一般是对基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的值。
    即如果对某assign成员变量B赋值某对象A的指针,则此B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。

  • 但在delegate成员变量这个细分领域,我们即可以用weak,又可以用assign。因为在几乎所有场景下,delegate所指向的对象C的生存期都是覆盖了delegate成员变量本身所在的对象D的生存期的,所以,在D的生存期内,C所使用的D的指针都是有效的,所以这个时候使用assign是没有关系的。

  • 注意: ViewController通常都会维护一个dataSource对象,这种场景下dataSource通常也会将ViewController的指针存储在自身的delegate属性中以供业务使用。而dataSource与ViewController是一对一的关系,如果ViewController被销毁,则其对应的dataSource也就没有存在的意义了,且ViewController的销毁也会马上引发dataSource的销毁。所以dataSource的delegate成员变量内存管理属性声明为assign是没有问题的,但weak属性有一个额外的好处是如果在ViewController销毁的时候,dataSource因为仍然被其他地方引用而导致其此时并没有跟随ViewController一起销毁,那么此时其delegate成员变量会自动被赋nil,相比于assign,此时它是更安全的做法。

相关文章

  • delegate使用weak修饰的原理

    weak修饰的属性不被所属对象持有,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。assign修...

  • 内存优化

    cell重用机制 循环引用delegate代理声明使用weak修饰NSTimerblock 其他NSNotific...

  • IOS

    一、Delegate为什么要用weak或者assign修饰,不能用strong?说明:weak、assign修饰的...

  • iOS使用WKWebView不调用dealloc

    1、使用了定时器,NSTimer没有销毁 2、delegate属性使用weak、asign修饰符 3、block使...

  • iOS Delegate使用assign修饰崩溃(应使用weak

    问题描述: Delegate使用assign修饰是产生崩溃。 原因: weak:指明该对象并不负责保持delega...

  • 深入理解 __weak 修饰符

    前言 刚开始接触 weak 修饰符时,是在使用 tableView 的 delegate 属性时,当时也就是仅仅知...

  • 类属性设置与修饰词

    Delegate修饰词 Delegate为了防止循环引用一般用weak和assign修饰,但这两者是有区别的,比如...

  • 修饰关键字的选择问题

    1.代理用nonatomic, weak修饰weak:指明该对象并不负责保持delegate这个对象,delega...

  • delegate 协议 weak 修饰

    weak :指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制器 stron...

  • iOS循环引用

    在iOS开发中,循环引用是个老生常谈的问题.delegate为啥使用weak修饰,block为什么需要weakSe...

网友评论

      本文标题:delegate使用weak修饰的原理

      本文链接:https://www.haomeiwen.com/subject/advnbxtx.html