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关闭,自己进行内存管理,让自己更好的了解内存机制.
在内存机制中,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关闭,自己进行内存管理,让自己更好的了解内存机制.
相关文章推荐
- iOS - 自动释放池与@autoreleasepool
- ios笔记--@property写法和autorelease pool自动释放池笔记
- ios自动释放池(autoreleasepool)
- Autoreleasepool自动释放池与内存相关
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- iOS---NSAutoreleasePool自动释放原理及详解
- [Cocos2D-X官方文档]:Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- 关于@autoreleasepool的性能测试及手动释放自动释放池
- iOS---NSAutoreleasePool自动释放原理及详解
- Autorelease Pool-自动释放池
- objective-C 自动释放池(autorelease pool)
- 《Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)》读后感
- 【amazing cocos2d-x 3.0之十三】内存管理(1):引用计数(Reference Count)和自动释放池(AutoReleasePool)
- CCAutoreleasePool(CCAutoreleasePool(自动释放池) CCPoolManager(成员:释放池数组 当前释放池等))
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- Object-C内存管理---资源自动释放池(The Autorelease Pool)
- 关于@autoreleasepool的性能测试及手动释放自动释放池