(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动作。