美文网首页
问题:什么情况使用 weak 关键字,相比 assign 有什么

问题:什么情况使用 weak 关键字,相比 assign 有什么

作者: 姜小舟 | 来源:发表于2020-05-07 15:43 被阅读0次
    什么情况使用 weak 关键字?

    weak表明该属性定义了一种(nonowning relationship)非拥有关系.为这种属性赋值时, 既不会保留新值,也不释放旧值。此特质同 assign 类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。

    • 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate、block。
    • 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak,使用 storyboard(xib 不行)创建的 vc,会有一个叫 _topLevelObjectsToKeepAliveFromStoryboard 的私有数组强引用所有 top level 的对象,所以这时即便 outlet 声明成 weak 也没关系。当然,也可以使用 strong。
    weak 和 assign 的不同点:
    • weak、assign 修饰的属性指向一个对象时都不会增加对象的引用计数。然而在所指的对象被释放时,weak 属性值会被置为 nil,而 assign 属性不会。
      weak 策略在属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针指向 nil,在 OC 给 nil 发消息是不会有什么问题的;如果使用 assign 策略在属性所指的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃
    • assign 可以用非 OC 对象以及基本类型,而 weak 必须用于 OC 对象

    相关文章

      网友评论

          本文标题:问题:什么情况使用 weak 关键字,相比 assign 有什么

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