iOS开发新发现面试搜集

闲聊iOS 中的weak、assign和strong

2017-02-15  本文已影响165人  木格措的天空

进入正题之前先了解两个概念:

我们先谈谈assign和weak

  1. assign:诞生于MRC,assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生悬空指针。一般是对C基本数据类型成员变量的声明,适用于基本数据类型如int,float,struct等,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯的指针赋值。举例如果把对象A的指针赋值给assign声明的成员变量B,则B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。

  2. weak:诞生于ARC,weak表示的是一个弱引用,这个引用不会增加对象的引用计数,并且在所指向的对象被释放之后,weak指针会被置为nil。避免悬空指针可能产生崩溃的问题。weak引用通常是用于处理循环引用的问题。关于weak底层的详细实现可参考这篇文章http://www.cocoachina.com/ios/20150605/11990.html

  3. 为什么ARC下修饰代理用assign会崩溃?

再说说weak和strong

  1. weak是弱引用,strong是强引用。举个比较容易理解的例子来加深对它们的理解:
  1. 补充一个知识点:

    • retain,copy,new,alloc会增加引用计数,还有addsubview、push也会增加,因为view会有一个栈(subviews),addsubview就是将subview加入这个栈,当然会增加。为什么push会增加,那是因为navcontroller有一个栈(viewcontrollers),push就是加入这个栈,当然会增加。
  2. 为什么在ARC下修饰delegate要用weak而不是strong?

    • 用tableview的代理(viewcontroller)例子来解释:
    • 如果tableview用strong强引用了其代理viewcontroller,viewcontroller又strong强引用了tableview,就造成了循环引用,谁都不能被释放,会造成内存泄漏。用weak使tableview弱引用viewcontroller,不会造成循环引用。
  3. 手动创建控件时,什么时候将控件声明成strong,什么时候将控件声明成weak?
    具体分析可以参考一下我的另一篇文章--《对手动创建控件时weak&strong的探究》
    http://www.jianshu.com/p/73f29071ab8a

  4. 为什么我们从xib或storyboard中引用到控制器的属性都是weak型指针?

    • 在控件放在view上的时候,已经形成了如下的引用关系,以UIButton为例:
      UIViewController->UIView->subView->UIButton
    • 为这个UIButton声明一个weak属性
      @property(nonatomic,weak) IBOOutlet UIButton *btn;

6.用strong,retain,copy修饰的属性对象,调用其set方法可使引用计数+1,编译器隐藏了retain等代码。

上一篇下一篇

猜你喜欢

热点阅读