什么情况使用 weak 关键字,相比 assign 有什么不同

539 阅读1分钟

1.什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用weak关键字?

ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegateblock,自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak。 自定义 IBOutlet 控件属性一般也使用weak,使用 storyboard(xib 不行)创建的 vc,会有一个叫 _topLevelObjectsToKeepAliveFromStoryboard 的私有数组强引用所有 top level 的对象,所以这时即便 outlet 声明成 weak 也没关系。当然,也可以使用 strong

weakassign 的不同点:

weak 不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。 assign 如果修饰基本数据类型如int,float,struct等值类型则是安全的。如果修饰对象,会产生野指针问题;修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。

站在巨人的肩膀上学习!如有侵权,请联系删除