1.什么情况使用 weak
关键字,相比 assign
有什么不同?
答:
什么情况使用weak
关键字?
在 ARC
中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如:
delegate
、block
,自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak
。
自定义 IBOutlet
控件属性一般也使用weak
,使用 storyboard(xib 不行)创建的 vc,会有一个叫 _topLevelObjectsToKeepAliveFromStoryboard
的私有数组强引用所有 top level
的对象,所以这时即便 outlet
声明成 weak
也没关系。当然,也可以使用 strong
。
weak
和 assign
的不同点:
weak
不会产生野指针问题。因为weak
修饰的对象释放后(引用计数器值为0),指针会自动被置nil
,之后再向该对象发消息也不会崩溃。 weak
是安全的。
assign
如果修饰基本数据类型如int,float,struct
等值类型则是安全的。如果修饰对象,会产生野指针
问题;修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。
站在巨人的肩膀上学习!如有侵权,请联系删除
网友评论