@autoreleasepool { 要实现代码块; }这就是代码的表现形式.接着我们来说说它的作用吧.
//在@autoreleasepool结束时或者被手动释放时,会对池中所有"加入了该池"的对象进行一次release操作,可以不再关心relea se的调用时间,也不需要再关心对象释放的时间.前面我们已经说过了,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,所以说不是很推荐用.最后我想说这是我分享给大家的我的心得,也是我的总结,希望对你们有用吧.