一.自动释放
什么是自动释放?字面意思就是一种事物用完之后就会自动脱落,用比喻就好比发射卫星的火箭,燃料用完了由于需要减轻重量,所以就得脱离主体.那么在oc中自动释放是什么意思呢?就是内存当中存有的数据,经过某些步骤到最后就释放了,也就是说不存在了.
二.自动释放池
既然说起了自动释放了,那么就不能忽略自动释放池了.怎么表示呢?
@autoreleasepool {
要实现代码块;
}
这就是代码的表现形式.接着我们来说说它的作用吧.
//在@autoreleasepool结束时或者被手动释放时,会对池中所有"加入了该池"的对象进行一次release操作,可以不再关心relea se的调用时间,也不需要再关心对象释放的时间.
前面我们已经说过了,release在内存中的作用了三句话:
//1)谁引用,谁retain;
//2)谁引用,谁release;
//3)谁retain,谁release;
三.autorelease与release的区别
那么怎么区分两者呢?我们来看看区别吧!
release是立即执行对象的retainCount -1操作,而autorelease是让对象加入自动释放池,并不立即执行计数器-1操作,在自动释放池结束时再执行release操作,相当于release操作的延迟.
我们来看看代码:
-(void)dealloc
{
NSLog(@"Person 销毁了....内存释放");
[super dealloc];
}
上面重写了父类的构造方法.看下面的访问.
Person *per = [[Person alloc] init];
[per release];
得出来的结果是:
[1383:1829431] Person 销毁了....内存释放
这是为什么呢?因为在release的时候直接,也就是释放的时候,调用了重写的方法.所以就打印出来了结果.也就是说德dealloc什么时候才会执行呢,也就是在realease释放的时候直接调用了.
Person *per = [[Person alloc] init];
// [per release];
当你注释掉了
[per release]
的时候是打印部出结果的.下面我们同过自动释放池来释放.
// [per release];
[per autorelease];
[1401:1880907] Person 销毁了....内存释放
看上面的结果完全的可以说明有些时候
autorelease
和
release
是可以相等的,但是又不完全相等.[per autorelease]设置在释放池自动销毁,并不是马上销毁.
四.autorelease作用的范围
那么autorelease运用有多大的范围呢?我们来看看下面的程序吧!
@autoreleasepool {
Person *per = [[Person alloc] init];
// [per release];
// [per autorelease];
}(1)
// [per autorelease];
NSLog(@"%p",per);//这段代码是无法执行的.
由上面的程序,我们就可以看出来,当代码出了途中的(1)处的时候是无法打印出结果的,也就是说会报错.所以也就是说
[per autorelease]
这段代码的作用域的hi在离它最近的花括号.
五.autorelease的使用注意
//1.只有在池内调用autorelease方法才加入自动释放池: [obj autorelease]
//2.每调用一次autorelease操作,自动释放池结束时会执行一次release操作,所以不要多次调用
//3.自动释放池是释放的延迟,不要在池内创建过多的对象,也不要对占用内存大的对象使用autorelease
//4.自动释放池嵌套:栈顶层池中的对象最先释放
上面写的一定是使用的重点,使用的时候要特别的注意,否则就会出错.
六.autorelease的不足
控制不灵活,只能等到释放池销毁才会release.不能很好的控制什么时候销毁,销毁的时候能调用dealloc,所以说不是很推荐用.最后我想说这是我分享给大家的我的心得,也是我的总结,希望对你们有用吧.