您的位置:首页 > 移动开发 > IOS开发

ios自动释放池相关,autoreleasepool;

2013-12-10 18:49 267 查看
在iOS中是没有像JAVA那样的垃圾回收机制的,它用到的是引用计数技术,及alloc一个对象时,这个对象就会有一个引用计数,如果该对象被通过retain或者copy引用是,它自身的引用计数就会+1,遇到release自身的引用技术就会减1,当这个对象的引用计数为1时,就会自动调用dealloc函数来释放掉它所拥有的对象类型的变量,然后系统收回该对象所占的内存.

在内存机制中,alloc和dealloc是对应使用的,alloc用来给对象开辟内存,而dealloc是用来在对象释放时收回内存;retain,copy是release对应使用的,前两者都是给对象的引用计数+1,后者-1;

在ios开发中,很多开发者经常会遇到的内存问题是自己写了alloc或者retain,copy后并没有写release,或者在错误的位置写了release,导致程序错误,或者内存泄露等问题,自动释放池的使用就可以把对象集中管理或者分批管理,在需要的某一个时刻一起释放掉.

在iOS中释放池的使用方法有两个:

第一个是:@autoreleasepool{

......

}

两个大括号之间便是释放池了,在内创建的对象在通过调用autorelease方法后会使对象延迟释放,在碰到下面的大括号的时候释放;

第二个是NSAutoreleasepool *pool = [[NSAutoreleasepool alloc]init] ;

''''''

[pool release];

这个释放池是程序员自己写的释放池,使用原理跟@auto是一样的,只不过这个是在对象碰到[pool release]后调用dealloc来进行释放;

一般我们会在便利构造器中的return后面加上autorelease,这样我们就不用在主函数或者类文件外面给对象创建时手动添加autorelease方法,也避免了大意而没有给对象自动释放;

在类的.m文件中给便利构造器添加自动释放其实只是一个方法调用,是对象在用便利构造器创建的时候自身就有了一个自动释放属性,遇到释放池释放,便调用方法开始释放.如果有其他情况,也可以在创建对象的时候在初始化后面加一个autorelease.

自动释放池其实就相当于一个数组,在建立释放池的时候会在栈里开辟一个空间,当池中有一个对象的时候,就给数组添加一个元素,以此类推,栈的特性是先进后出,所以在自动释放池中的对象也是从最后一个添加进来的开始逐一一次释放,所以如果你创建了很多ge类依次创建对象,并在类的.m文件按中在dealloc方法里nslog的话你就会很直观的看到这个情况.

现在的版本已经把arc自动加入了程序,所以现在开发者就可以不用自己管理内存了.但是初学者最好把arc关闭,自己进行内存管理,让自己更好的了解内存机制.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: