------ android培训、java培训、期待与您交流! ----------
OC基础—内存管理之autorelease
autorelease:半自动释放
我们建立一个Person类
之前我们在使用每一个alloc的时候都要release一次就像
int main()
{
Person *p = [[Person alloc] init];
p.age = 10;
[p release]
return 0;
}
在每个alloc后都要加一个release,这样少的时候还好说,但是如果对象多了,那么每个对象在创建的是有都要alloc,然后都要release。可想而知,这是多麽的麻烦,而且极易写错。还有向上面的代码,如果p.age = 10; 写在了[p release];的后面,那么就会出现野指针错误,这样我们很难保证我们代码的正确性。
那么怎么解决呢,这时我们可以用autorelease方法
int main( )
{
@autoreleasepool {
Person *P = [[[Person alloc] init] autorelease];
// autoreleasehe release不能同时存在
//[p release];
}
return 0;
}
autorelease这个方法会返回对象本身,是一个对象方法。
autorelease会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里的所有对象做一次release操作。
@autoreleasepool
{ // 大括号代表了创建了释放池
}; // 结束代表销毁释放池
这就是自动释放池。
自动释放池运行:
1. 在IOS程序运行过程中,会创建无数个池子,这些池子斗志以栈结构存在(先进后出)
2. 当一个对子调用autorelease方法时,会将这个对象放到栈顶的释放池
autorelease基本用法:
1. 会将对象放到一个自动释放池中
2. 当自动释放池销毁的时候,会对池子里的所有对象做一次release操作
3. 会返回对象本身
4. 调用玩autorelease方法后,对象的计数器不变
autorelease的好处:
1. 不用关心对象释放的时间
2. 不用在关心什么时候调用release
autorelease使用注意:
1. 占用内存较大的对象不要随便使用autorelease
2. 占用内存较小的对象使用autorelease,没有太大影响
错误写法:
1. alloc之后调用autorelease,又调用了release
@autoreleasepool {
Person *P = [[[Person alloc] init] autorelease];
autoreleasehe release不能同时存在
[p release];
}
2. 连续调用多次autorelease
@autoreleasepool{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}