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