您的位置:首页 > 其它

OC学习心得之内存管理

2015-11-15 17:29 239 查看


在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时,系统自动向对象发送一条dealloc消息;

主要功能是释放成员变量的所有权;

最后调用[super dealloc]释放父类变量。

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

内存管理的基本原则:

如果使用alloc(或者copy、new)方法创建一个对象,或者使用retain保留一个对象,那么,都要自己释放对象。

在大多数情况下,申请内存的语句数量和释放内存的语句数量应该相等。

尽量少使用内OC的MRC,总之要记住一条黄金法则:谁创建谁release,谁retain谁释放。存,用完后记得立即释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: