IOS内存管理

来源:互联网 发布:php 权限管理框架 编辑:程序博客网 时间:2024/05/17 08:15


    IOS中没有内存管理机制,需要开发者手动管理内存,虽然有ARC(Apple提出的自动释放内存),但并不是真正意义的自动释放,它与java里面的纯自动释放内存还不一样,其本质还是C语言式的手动释放内存,只是稍微增加了点自动的功能,ios还是将内存管理的任务交给了开发者。

    OC与C虽然都是手动释放内存,但是还是有所不同,C直接调用free函数来释放内存,而OC并不直接调用dealloc来释放,OC使用对象引用,每个对象都有一个引用计数器,当计数器为0时,系统会自动调用dealloc函数来释放内存,OC也提出了自动释放内存autorelease属性,但是也只是半自动而已。

    OC的内存管理,归根结底要记住一条黄金法则:谁创建谁释放,谁retain谁释放。

    在OC中,当我们对一个对象拥有控制权后,都需要进行释放,但是如何拥有对象的控制权呢?当我们对对象进行了alloc、retain、copy操作后,我们拥有了对象的控制权,因此需要对其进行释放(除了这3个操作,还有个new也能实现alloc类似的功能,但是不建议使用,因此,如果碰见new,也需要进行释放)。

     OC采用了引用计数(retain count)。对象的内部保存一个数字,表示被引用的次数,使用alloc或者copy(或者new)方法创建一个对象时,其计数器的值为1,调用retain方法,引用次数就+1,调用releas方法就-1,当计数器到0的时候,系统会自动调用alloc方法来释放内存中的对象。当release对象后,其retaincount计数如果为0,建议nil一次,例如:

    NSObject *obj = [[NSObject alloc] init];

    [obj release];

    obj = nil;

在这里进行nil赋值的原因是最后一次release对象后,其引用计数可能不立即为0,读者可以打印引用计数看看,可能会为1,而且此时此对象可能会指向其它一段内存区域,如果进行调用,可能会导致其它问题,如可能形成野指针,所以最好是进行一次nil赋值。

    对于dealloc方法:

  • 此方法从NSObject继承过来,不需要在.h文件中进行声明;
  • 此方法不需要自己手动调用,当引用计数为0时,系统自动调用;
  • 主要功能是释放成员变量的所有权;
  • 最后调用[super dealloc]释放父类变量

    为防止内存泄漏,并确保最有效地使用内存,应用程序只在需要时才装在数据。至于autorelease,它可以简化内存管理代码,系统会自动释放autorelease池中的对象,但是,如果总是使用auterelease,也可能形成内存泄漏,问题在于autorelease池的释放时机,每当执行应用程序时,系统自动创建autorelease池,系统并不是立即释放autorelease池中的对象,而是在一个run loop之后才释放,一般是微秒级别,本来对象可以立即释放,但是系统很有可能过一些时候才释放autoreleae池中的对象,因此我们建议尽量自己进行内存管理,而不要太依赖autorelease。

    下面是几个内存管理的基本原则:

  • 如果使用alloc(或者copy、new)方法创建一个对象,或者使用retain保留一个对象,那么,都要自己释放对象。
  • 在大多数情况下,申请内存的语句数量和释放内存的语句数量应该相等。
  • 尽量少使用内存,用完后记得立即释放。
原创粉丝点击