非ARC模式下内存管理总结

来源:互联网 发布:被广电禁播的网络剧 编辑:程序博客网 时间:2024/06/03 13:42

如果我们不使用ARC来自动管理内存,那么则应该记住以下准则:

1.对于临时对象:

a.通过alloc/new/copy获得的对象,应该在不再使用时释放该对象(release);

b.通过其他任何方法获得的对象,我们假设该对象的retainCount为1,且被设置为自动释放对象,因此我们不需要做任何事情;

2.对于你打算长期拥有的对象,例如你希望其他的实例对象可以访问这个对象:

a.通过alloc/new/copy获得的对象,应该在dealloc方法中释放该对象;

b.通过其他任何方法获得的对象,因为我们假设该对象的retainCount为1,且被设置为自动释放对象,现在你希望长期拥有这个对象,因此我们需要保留他(retain),同时在不再使用他的时候,在dealloc方法中释放这个对象,我们应该保证retain和release方法的使用次数是相等的;


另外,不管一个对象的retainCount是多少,比如一个NSString对象str的retainCount为2,如果执行str = nil;   那么str的retainCount都会被置为0,具体原因在这里。


因此,判断一个对象应该如何实现内存管理时,我们可以先看这个对象是怎么得到的,然后考虑我们是临时使用它还是想长期保留它,依次做出决策。


另外,自动释放池NSAutoreleasePool是以栈的形式实现的,因此当你创建一个自动释放池并加入一个希望自动释放的对象以后,再新建一个自动释放池,随后release这个自动释放池,之前创建的对象并不会被释放,因为存放他的那个自动释放池还是存在的。


实际上,在编写iPhone程序时,苹果公司建议你不要在自己的代码中使用autorelease方法,同时还要避免使用创建自动释放池对象的便利函数。

1 0
原创粉丝点击