美文网首页iOSiOS & OS X 内存管理iOS开发技术分享
delegate的内存管理属性是weak还是assign

delegate的内存管理属性是weak还是assign

作者: 纵横而乐 | 来源:发表于2015-08-27 11:27 被阅读5198次

ARC引入strong和weak两个内存管理属性(以及__strong, __weak, __unsafe_unretained, __autoreleasing四个变量生命期qualifier)之后,对象的delegate成员变量就面临着对内存管理属性的选择:weak or assign

众所周知,weak属性的变量是不为其所属对象持有的,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。而assign属性一般是对C基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的值。即如果对某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属性有一个额外的好处是如果在view controller销毁的时候,datasource因为仍然被其他地方引用而导致其此时并没有跟随view controller一起销毁,那么此时其delegate成员变量会自动被赋nil,相比于assign,此时它是更安全的做法。

相关文章

  • delegate的内存管理属性是weak还是assign

    ARC引入strong和weak两个内存管理属性(以及__strong, __weak, __unsafe_unr...

  • 需要了解的基础知识点

    一、weak和assign有什么区别 修饰delegate的属性是weak还是assign比较好? 答:assig...

  • OC中属性修饰符对容器的影响

    OC中用于内存管理的属性修饰符有:copy、strong、weak、assign、unsafe_unretaine...

  • iOS 内存管理语义中的 Strong 与 Copy

    开发中使用属性很频繁,常见的属性内存管理语义主要有 strong、copy、weak、assign,本次主要介绍下...

  • ios面试

    delegate 为啥assign weak修饰 一般使用代理都会设置控制器为代理,在内存管理角度说引用计数会加...

  • IOS

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

  • 内存管理相关

    一、ARC管理内存是使用assign还是weak? assign: 可以修饰基本数据类型,也可以修饰对象。修饰代理...

  • 内存管理

    一、内存管理语义(assign、strong、weak等的区别) 1、assign “设置方法” 只会执行针对“纯...

  • iOS开发OC属性关键字

    内存管理常用几种:assign、strong、weak、copyassign适用于基本数据类型,weak适用于NS...

  • iOS内存管理指北

    文章目录 一.内存管理准则 二.属性内存管理修饰符全解析 三.block中的weak和strong 四.weak是...

网友评论

  • specter_hhg:"但weak属性有一个额外的好处是如果在view controller销毁的时候,datasource因为仍然被其他地方引用而导致其此时并没有跟随view controller一起销毁,那么此时其delegate成员变量会自动被赋nil,相比于assign,此时它是更安全的做法。"
    如果是使用assign,那么在view controller销毁的时候,datasource因为仍然被其他地方引用而导致其此时并没有跟随view controller一起销毁吗?
  • bb661cad2ca2:知道weak和assign有区别,我就放心了

本文标题:delegate的内存管理属性是weak还是assign

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