您的位置:首页 > 移动开发 > Objective-C

非ARC模式下内存管理总结

2016-03-02 11:22 399 查看
如果我们不使用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方法,同时还要避免使用创建自动释放池对象的便利函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息