strong & weak 的理解

  1 import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 /*weak*/
  5 @property (nonatomic,weak)UISwitch *weakSwitch;
  6 /*strong*/
  7 @property (nonatomic ,strong)UISwitch *strongSwitch;
  8 /*weak*/
  9 @property (nonatomic,weak)UIButton *weakButton;
 10 @end
 11 
 12 @implementation ViewController
 13 
 14 /*
 15  1:strong:代表强引用,
 16  2:weak:代表弱引用,
 17  3:我们创建的变量,默认都是强引用
 18  */
 19 
 20 - (void)viewDidLoad {
 21     [super viewDidLoad];
 22     
 23     /*
 24      1:局部变量:在该变量创建完对象,就默认有一个强引用,但是当局部变量所在的方法执行完毕后,局部变量就会被销毁。
 25      2:变量用__weak 和 __strong修饰,创建变量时,默认都为__strong,用__weak修饰,如:
 26       __weak  UIButton *btn = [[UIButton alloc]init];
 27      则变量该创建完毕就会被销毁,可以通过打印变量的内存地址:%p打印内存地址来查看有没有被销毁
 28      
 29      */
 30     
 31     //1:__weak和__strong的理解
 32     __weak  UIButton *btn = [[UIButton alloc]init];
 33      NSLog(@"------1----btn=%p-------",btn);//btn对象被销毁
 34     UILabel *label = [[UILabel alloc]init];//label为局部变量,对象没被立即销毁,直到viewDidLoad方法执行完毕后销毁
 35     
 36     //2:属性weak,strong的理解:
 37     
 38      //weak引用:也就是弱指针引用:创建完对象后立即被销毁
 39      self.weakSwitch = [[UISwitch alloc]init];//创建完对象后立即被销毁
 40      NSLog(@"------2----self.weakSwitch=%p-------",self.weakSwitch);
 41     
 42     
 43     //strong强指针引用:创建完对象不会立即销毁,直到控制器销毁的时候,该变量才会被销毁
 44     self.strongSwitch = [[UISwitch alloc]init];
 45      NSLog(@"------3----self.strongSwitch=%p-------",self.strongSwitch);
 46     
 47     
 48     //3:将强引用的指针赋值给弱引用指针:self.weakSwitch对象不会被销毁
 49     /*
 50      1:因为[[UISwitch alloc]init]创建出一个对象后,默认有一个强引用,不会立即销毁,直到整个方法执行完毕后才会销毁。有一个强引用self.strongSwitch指向Switch对象,则Switch对象直到整个控制器销毁的时候才会被释放。
 51      2:self.weakSwitch = self.strongSwitch;将强引用对象赋值,其实也就是将强引用的指针赋值给弱引用,也就是两个指针指向同一块内存地址,但是两者区别,一个而是强引用,一个是弱引用。
 52      
 53      3:所以Switch对象分别有一个强引用指针和一个弱引用指针,为什么没有立即被销毁?是因为还有一个强指针引用switch对象
 54      
 55      */
 56     self.weakSwitch = self.strongSwitch;
 57     NSLog(@"-----4----- self.weakSwitch=%p-------", self.weakSwitch);
 58     
 59     //4:self.weakButton没有被销毁,
 60     
 61     /*
 62      1:打印5,6,7其中,57,self.weakButton没有被销毁,因为 UIButton *button = [[UIButton alloc]init] 创建出对象默认有一个强引用,只要该方法没有执行完,就不会被销毁,即使有若指针指向
 63      2:但是6中打印却被销毁,因为其为成员变量,出了该方法的作用域,没有了强指针指向了所以会被立即销毁
 64      
 65      3:打印5,6,7self.weakButton都没有被销毁,若将button添加到self.view上,则在addSubview时,view会对button有一个强引用,出了该方法的作用域,self.view依然有一个强引用指向button,所以对象不会被销毁,self.weakButton指针可以找到该内存地址,所以self.weakButton也不会被销毁
 66      4:[[UIButton alloc]init] 操作是向内存申请开辟一段内存空间,button为一个指针,指向这块内存地址,默认为强指针,若是局部变量,则出了方法的作用域,强指针引用消失,这块内存地址也就会被释放。弱指针指向的内存区域不存在,若指针也消失被释放 self.weakButton = button;此操作是将指针赋值给self.weakButton,则self.weakButton也指向同一块的内存空间,但是若指针,但是在该方法作用域内,这块内存空间一直被强指针引用,所以弱指针指向的这块内存空间依然可以被找到,弱指针也没有被释放。
 67      
 68      5:若是 __weak  UIButton *btn = [[UIButton alloc]init];或是 self.weakSwitch = [[UISwitch alloc]init];若是以上两种写法,则对象立即被释放。两者都是直接弱指针赋值,没有强引用,所以创建完毕后立即销毁
 69      */
 70     
 71     UIButton *button = [[UIButton alloc]init];
 72     self.weakButton = button;
 73     NSLog(@"----5---- self.weakButton=%p-------", self.weakButton);
 74     [self test];
 75     [self.view addSubview:button];
 76     
 77     
 78     /*
 79     5:关于xib中拖线时控件用weak修饰:因为viewcontroller对view有一个强引用,控件添加到view时,则view又对控件有一个强引用,当从控制器拖线时,显示为weak,因为view已经有一个强引用了,保证了控件不被销毁,其实strong也可以,因为销毁的顺序为,控制器先销毁,上面的view没有了强引用,也就被销毁,控件没有了view的强引用,和控制器的强引用则依然被销毁
 80      
 81      */
 82     
 83     
 84 }
 85 
 86 - (void)viewDidAppear:(BOOL)animated {
 87     
 88     [super viewDidAppear:animated];
 89       NSLog(@"----6---- self.weakButton=%p-------", self.weakButton);
 90 }
 91 
 92 
 93 
 94 - (void)test {
 95     
 96       NSLog(@"----7---- self.weakButton=%p-------", self.weakButton);
 97     
 98 }
 99 
100 @end

 

posted on 2016-07-29 13:40  Hello_IOS  阅读(679)  评论(0编辑  收藏  举报

导航