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