OC-EX25引用计数器

OC-EX25引用计数器
 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  */

你可能感兴趣的:(OC-EX25引用计数器)