| 
 
| autorelease (1)自动释放池
 IOS运行的过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。当一个对象调用autorelease时,会将这个对象
 放到位于栈顶的释放池中。
 他是一种支持引用计数的内存管理方式。他可以暂时保存某个对象,然后在内存池自己排干的时候对其中的每个变量发送release消息
 注意:这里只是发送release消息,但是如果当时的引用计数依然不为0,则该对象依然不会被释放。可以用该方法保存某个对象,也
 要注意保存之后要释放对象。
 (2)自动释放池的创建方法
 IOS5.0之后的创建方法
 @autoreleasepool
 {                        //开始代表创建自动释放池
 ...................
 }                       //结束代表销毁自动释放池
 (3)自动释放池是一种特殊的栈结构
 
 
 为什么会有autorelease
 OC的内存管理机制的原则是“谁申请,谁释放”。如果一个方法需要返回一个新建的对象该如何释放?
 方法内部是不可能写release释放对象的;调用者也不会主动释放该对象的,因为调用者遵循"谁申请,谁释放的原则",这样的话就会
 产生内存泄露。正是基于此,autorelease才实现的。
 
 
 使用autorelease的好处
 (1)不需要关心对象释放的时间
 (2)不需要关心什么时候调用release
 
 autorelease的基本用法
 (1)会将对象放到一个自动释放池中
 (2)当自动释放池被销毁时,会将池子里的所有的对象做一次release
 (3)会返回对象本身
 (4)调用玩autorelease方法后,对象的计数器不收影响(销毁时影响)
 
 
 注意事项:
 (1)并不是所有的放到自动释放池的中代码,产生的对象就会自动释放,如果需要释放,必须加入自动释放池
 Person *p = [Person new];
 @autoreleasepool{
 
 [p autorelease];//加入自动释放池
 }//结束后,开始对象的release动作。
 (2)如果对象调用了autorelease,但是调用的时候,并不是在任何自动释放池中,该对象也不会被加入到自动释放池中
 Person *p = [Person new];
 @autoreleasepool{
 
 }//结束后,开始对象的release动作。
 [p autorelease];
 (3)autorelease的使用其实是延迟了空间的释放,所以不建议在autoreleasepool中使用太多的代码。
 Person *p = [Person new];
 @autoreleasepool{
 //10000行代码
 [p autorelease];//加入自动释放池
 }
 注:P的释放只有在10000行代码运行完成之后才会释放P的空间。
 (4)不要将大量的循环操作放到同一个@autorelease之间,会造成内存峰值的上升。
 Person *p = [Person new];
 @autoreleasepool{
 [p autorelease];//加入自动释放池
 for(int = 0; i < 10000; i++){
 Person *temp = [[Person new] autorelease];//不能这么使用
 }
 }
 (5)autorelease之后,注意release的使用是否必要;
 
 
 
 自动释放池的嵌套使用
 (1)基本用法
 @autoreleasepool{        //该autorelease在栈底
 @ autoreleasepool{ //该autorelease在栈中
 @autoreleasepool{//该autorelease在栈顶
 [p autorelease];
 }
 [p autorelease];
 }
 }
 (2)
 @autoreleasepool{        //该autorelease在栈底
 @ autoreleasepool{ //该autorelease在栈中
 @autoreleasepool{//该autorelease在栈顶
 [p autorelease];
 }
 [p autorelease];
 [p autorelease];
 [p autorelease];//不建议这样使用,这样使用,会导致对象的多次release。
 }
 
 自动释放池的使用
 (1)创建自动释放池
 @autoreleasepool{
 
 
 }
 (2)对象加入自动释放池
 Person *p = [Person new];
 @autoreleasepool{
 
 [p autorelease];
 }//结束后,开始对象的release动作。
 | 
 |