1 //
2 // main.m
3 // ARC基本原理
4 //
5 // Created by sixleaves on 15/5/12.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Dog.h"
12 void test1();
13 void test2();
14 int main(int argc, const char * argv[]) {
15
16 //test1();
17 test2();
18
19 return 0;
20 }
21
22 void test1() {
23
24 Person *p = [[Person alloc] init];
25
26 __weak Person *p2 = p;
27
28 p = nil; // 在這行運行后,Person就被釋放
29 /*
30 因為在27行,我們清空了指針p,就沒有強指針指向,Person對象
31 所以,27行一運行結束,Person對象就會被釋放。雖然有p2指向Person
32 對象,但是p2是弱指針。淡然如果把__weak去掉,默認是__strong,則
33 運行完27行后,Person對象還不會被釋放。
34 */
35
36 NSLog(@"test1");
37 }
38
39 void test2() {
40
41 Person *p = [[Person alloc] init];
42
43 Dog * d = [[Dog alloc] init];
44
45 p.dog = d;
46
47 d = nil; // 這行運行結束后,狗不會被釋放,因為p對象中還有個強指針,指向狗對象。
48
49 NSLog(@"test2");
50
51 p = nil;
52
53 NSLog(@"All-dealloc");
54 /*
55 這行執行完后,由于沒有強指針指向Person對象
56 所以,Person對象會被釋放,并且會銷毀掉Person
57 對象中擁有的對象(Dog的指針變量)。所以就沒有強指針
58 指向dog,所以Dog對象也會被銷毀。
59 */
60
61 }
62
63 /*
64 ARC釋放對象的判斷準則: 只要沒有強指針指向對象,就會銷毀對象。
65
66 ARC的特點
67 1> 不允許調用release、retain、retainCount
68 2> 允許重寫dealloc,但是允許調用[super dealloc]
69 3> @property參數
70 strong:相當于retain(適用于OC對象)
71 weak:相當于assign(適用于OC對象)
72 assign:適用于非OC對象
73 4> 用strong替換retain
74
75 指針分2種:
76 1>強指針:默認情況下,所有的指針都是強指針.(默認用__strong修飾)
77 2>弱指針:__weak
78
79 Tips:如果你想持有對象,那么就用強指針,如果不想持有對象,就用弱只這么。
80
81 常見錯誤:
82 __weak Perosn *p = [[Person alloc] init];
83 //這種錯誤是沒有理解ARC釋放對象的判斷準則。沒有強指針指向Person對象,
84 一創建就會被釋放。
85
86
87 掌握:
88 1.ARC釋放對象的判斷準則
89 2.ARC的四個特點
90 3.強指針與弱指針的概念
91 4.常見錯誤
92 */
93