autorelease基本用法:
1>会将对象放到一个自动释放池中
2>当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3>会返回对象本身
4>调用完autorelease方法后,对象的计数器不变
主要形式:
int main()
{
@autoreleasepool
{
Person *p = [[[Person alloc] init] autorelease];
//开始创建释放池
}//开始销毁释放池
}
autorelease好处:
1>不用关心对象的释放时间
2>不用再关心什么时候调用release
注意事项:
1>占用内存较大的对象不要随便使用autorelease, 不能精确控制释放的时间,和内容释放时间,所以还是自己使用release回收内存
2>占用内存较小的对象使用autorelease影响不是很大
在下列情形会出现错误:
@autoreleasepool
{
Person *p = [[[[ Person alloc] init] autorelease] autorelease];
}
会提示Unused variable "p" 无效的指针,野指针;
@autoreleasepool
{
Person *p = [[[ Person alloc] init] autorelease] ;
[p release];
}
alloc之后调用autorelease,又调用release是不容许的。
当然最重要的是使用autorelease必须拥有自动释放池,这个自动释放池是在栈中。也就是必须有@autoreleasepool,遵循先进后出原则,ios程序会有N多自动释放池。一个对象调用autorelease情况,就会放到栈顶释放。
ios5.0使用方式
其实原理是一样的,只不过最终的样式升级了!