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 */