f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
 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 */
posted on 2015-05-05 16:17 swp 阅读(127) 评论(0)  编辑 收藏 引用 所属分类: objective-c

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理