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(@"計數(shù)器: %ld", myCount);
28
29
30 /*
31 我們重寫了dealloc,但是系統(tǒng)打印出"Person-dealloc",說明這個對象并沒有被回收。
32 而對象被回收只有兩種情況,一種是main函數(shù)運(yùn)行結(jié)束,此時程序結(jié)束,系統(tǒng)自動回收所有對象
33 一種是引用計數(shù)器為0,系統(tǒng)自動回收,可見這是屬于第一種,說明main函數(shù)是處于一個循環(huán)中。
34 */
35
36 [p retain];
37
38 [p release]; // 對應(yīng)于retain
39 [p release]; // 多了這一行,對象會被回收。對應(yīng)于alloc
40
41
42 return 0;
43 }
44
45 /*
46 A。管理范圍:任何繼承了NSObject的對象。其他基本數(shù)據(jù)類型無效。
47
48 B。數(shù)據(jù)結(jié)構(gòu):
49 1.每個OC對象內(nèi)部都有4個字節(jié)的存儲空間來存儲引用計數(shù)器,用來表示有多少指針正指向該對象。
50
51 C。引用計數(shù)器的創(chuàng)建:
52 1.當(dāng)使用alloc\new\copy創(chuàng)建一個新對象時,對象的引用計數(shù)器就是1。
53 2.當(dāng)一個對象的引用計數(shù)器為0時,對象占用的內(nèi)存就會被系統(tǒng)回收。
54
55
56 D。引用計數(shù)器的操作:
57 給對象發(fā)送一條retain消息,可以使引用計數(shù)器+1,并且返回對象本身。
58 給對象發(fā)送一條release消息,可以使引用計數(shù)器-1。
59 給對象發(fā)送一條retainCount消息獲得當(dāng)前引用計數(shù)器的值。
60
61 E.對象的銷毀的過程:
62 1.當(dāng)一個對象的引用計數(shù)器為0.它將被銷毀,其占用的內(nèi)存將被系統(tǒng)回收。
63 2.當(dāng)一個對象被銷毀時,系統(tǒng)會自動向?qū)ο蟀l(fā)送一條dealloc消息(相當(dāng)于C++的析構(gòu)函數(shù),做掃尾工作)。
64 3.所以一般會自己重寫dealloc方法,來釋放相關(guān)資源。
65 4.一旦重寫了dealloc、就必須在最后面調(diào)用[super dealloc];
66
67 F:如何判斷對象有沒有回收
68 1.重寫dealloc方法。簡單打印一下NSLog
69
70 //內(nèi)存管理原則。
71 1.調(diào)用了alloc必須調(diào)用release,調(diào)用了retain必須調(diào)用release
72
73 */