1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject // 繼承了NSObject
4
5 @end
6
7 @implementation Person
8
9
10 - (void)dealloc
11 {
12
13 NSLog(@"Person-dealloc");
14
15 [super dealloc];
16 }
17
18 @end
19
20 int main() {
21
22
23 Person *p = [[Person alloc] init];
24
25 NSUInteger myCount = [p retainCount]; // NSUInteger == unsigned long
26
27 NSLog(@"計數器: %ld", myCount);
28
29
30 /*
31 我們重寫了dealloc,但是系統打印出"Person-dealloc",說明這個對象并沒有被回收。
32 而對象被回收只有兩種情況,一種是main函數運行結束,此時程序結束,系統自動回收所有對象
33 一種是引用計數器為0,系統自動回收,可見這是屬于第一種,說明main函數是處于一個循環中。
34 */
35
36 [p retain];
37
38 [p release]; // 對應于retain
39 [p release]; // 多了這一行,對象會被回收。對應于alloc
40
41
42 return 0;
43 }
44
45 /*
46 A。管理范圍:任何繼承了NSObject的對象。其他基本數據類型無效。
47
48 B。數據結構:
49 1.每個OC對象內部都有4個字節的存儲空間來存儲引用計數器,用來表示有多少指針正指向該對象。
50
51 C。引用計數器的創建:
52 1.當使用alloc\new\copy創建一個新對象時,對象的引用計數器就是1。
53 2.當一個對象的引用計數器為0時,對象占用的內存就會被系統回收。
54
55
56 D。引用計數器的操作:
57 給對象發送一條retain消息,可以使引用計數器+1,并且返回對象本身。
58 給對象發送一條release消息,可以使引用計數器-1。
59 給對象發送一條retainCount消息獲得當前引用計數器的值。
60
61 E.對象的銷毀的過程:
62 1.當一個對象的引用計數器為0.它將被銷毀,其占用的內存將被系統回收。
63 2.當一個對象被銷毀時,系統會自動向對象發送一條dealloc消息(相當于C++的析構函數,做掃尾工作)。
64 3.所以一般會自己重寫dealloc方法,來釋放相關資源。
65 4.一旦重寫了dealloc、就必須在最后面調用[super dealloc];
66
67 F:如何判斷對象有沒有回收
68 1.重寫dealloc方法。簡單打印一下NSLog
69
70 //內存管理原則。
71 1.調用了alloc必須調用release,調用了retain必須調用release
72
73 */