oc中的内存管理机制

来源:互联网 发布:waphyseccom软件下载 编辑:程序博客网 时间:2024/06/07 06:51
1基本原理
oc的内存管理机制与.Net/java那种全自动的垃圾回收机制是不同的,它本质上还是C语言的手动管理方式,只不过稍微加了些自动方法。
1、 Objective-c的对象生成之后,需要一个指针来指向它。
ClassA *class1 = [[ClassA alloc] init];
2、oc的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。
[self dealloc];
这带来一个问题,下面代码中class2是否需要调用dealloc?
ClassA *class1 = [[ClassA alloc] init];
ClassA *class2 = class1;
[class1 hello];//输出hello
[class1 dealloc];
[class2 hello];
[class2 dealloc];

3、oc采用了引用计数(refcount或者retaincount).对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retain count为2.需要销毁对象的时候,不直接调用dealloc,而是调用release.release会让retain count减一,只有 retain count等于0,系统才会调用dealloc真正销毁这个对象。
ClassA *class1 = [[ClassA alloc] init];//对象生成时,retain count = 1;
[class1 release];//release使retain count减1,retain count = 0,dealloc自动被调用,对象被销毁
我们回头看看刚刚那个无效指针的问题,把dealloc改成release解决了吗?
ClassA *class1 = [[ClassA alloc] init];//retain count = 1
ClassA *class2 = class1;//retain count = 1
[class1 hello];//输入hello
[class1 release];//retain count = 0,对象被销毁
[class2 hello];
[class2 release];
[class1 release]之后,class2依然是个无效指针。问题依然没有解决。

4.oc指针赋值时,retain count 不会自动增加, 需要手动 retain.
ClassA *class1 = [[ClassA alloc] init];//retain count = 1;
ClassA *class2 = class1;//retain count = 1;
[class2 retain];//retain count = 2
[class1 hello];// 输出hello
[class1 release];//retain count = 2 - 1 = 1
[class2 hello];输出hello
[class2 release];retain count = 0,对象被销毁
问题解决!注意,如果没有调用[class2 release],这个对象的retaincount 始终为1,不会被销毁,内存泄露。
这样的确不会内存泄露,但似乎有点麻烦,有没有简单点的方法?

5、oc中引入了autorelease pool(自动释放对象池),在遵守一些规则的情况下,可以自动释放对象。
新生成的对象,只要调用autorelease就行了,无需调用release!
 对于存在指针赋值的情况,代码与前面类似。
      ClassA *class1 = [[[ClassA alloc] init] autorelease];//retain count = 1
      ClassA *class2 = class1;//retain count = 1;
      [class2 retain];//retain count = 2
      [class1 hello];//输出hello
      //对于 class1,无需调用(实际上不能调用)release
     [class2 hello];//输出hello
     [class2 release];//retain count = 2 - 1 = 1

0 0
原创粉丝点击