A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

OC的内存管理,归根结底要记住一条黄金法则:谁创建谁释放,谁retain谁释放。
在OC中,当我们对一个对象拥有控制权后,都需要进行释放,但是如何拥有对象的控制权呢?当我们对对象进行了alloc、retain、copy操作后,我们拥有了对象的控制权,因此需要对其进行释放(除了这3个操作,还有个new也能实现alloc类似的功能,但是不建议使用,因此,如果碰见new,也需要进行释放)。
OC采用了引用计数(retain count)的方法。对象的内部保存一个数字,表示被引用的次数,使用alloc或者copy(或者new)方法创建一个对象时,其计数器的值为1,调用retain方法,引用次数就+1,调用release方法就-1,当计数器到0的时候,系统会自动调用alloc方法来释放内存中的对象。当release对象后,其retain count计数如果为0,建议nil一次,例如:
    NSObject *obj = [[NSObject alloc] init];
    [obj  release];
    obj = nil;
在这里进行nil赋值的原因是最后一次release对象后,其引用计数可能不立即为0,读者可以打印引用计数看看,可能会为1,而且此时此对象可能会指向其它一段内存区域,如果进行调用,可能会导致其它问题,如可能形成野指针,所以最好是进行一次nil赋值。
对于dealloc方法:
此方法从NSObject继承过来,不需要在.h文件中进行声明;
此方法不需要自己手动调用,当引用计数为0时,系统自动调用;
主要功能是释放成员变量的所有权;
最后调用[super dealloc]释放父类变量。
为防止内存泄漏,并确保最有效地使用内存,应用程序只在需要时才装在数据。至于autorelease,它可以简化内存管理代码,系统会自动释放autorelease池中的对象,但是,如果总是使用autorelease,也可能形成内存泄漏,问题在于autorelease池的释放时机,每当执行应用程序时,系统自动创建autorelease池,系统并不是立即释放autorelease池中的对象,而是在一个run loop之后才释放,一般是微秒级别,本来对象可以立即释放,但是系统很有可能过一些时候才释放autorelease池中的对象,因此我们建议尽量自己进行内存管理,而不要太依赖autorelease。
内存管理的基本原则:
如果使用alloc(或者copy、new)方法创建一个对象,或者使用retain保留一个对象,那么,都要自己释放对象。
在大多数情况下,申请内存的语句数量和释放内存的语句数量应该相等。
尽量少使用内存,用完后记得立即释放。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马