14、autoreleasepool

一、

自动释放池
(1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构 (先进后出)存在的。
(2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释 放池中。
@autoreleasepool{
Person *p = [[[Person alloc] init] autorelease];
}
autorelease会返回对象本身

二、

原理:
autorelease实际上只是把对release的调用延迟了,对于每一个
Autorelease,系统只是把该 Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用 Release。

触发机制:
1)手动释放Autorelease pool
2)Runloop结束后自动释放

流程:
(1)会将对象放到一个自动释放池中 
(2)当自动释放池被销毁时,会对池子里的所有对象做一次release 
(3)会返回对象本身 
(4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)

三、

注意:
1)、并不是放到自动释放池代码中,都会自动加入到自动释放池
没有调用 autorelease 方法,对象不会加入到自动释放池,必须手动调用autorelease方法
@autoreleasepool{
Person *p = [[Person alloc] init]];
}
2)、在自动释放池的外部发送autorelease 不会被加入到自动释放池中
@autoreleasepool{
}
Person *p = [[[Person alloc] init] autorelease];
3)、不管这个对象是在自动释放池内还是外创建的,只要在自动释放池内写一个[p autorelease];p1就会被放到自动释放池中。
Person *p = [[Person alloc] init];
@autoreleasepool{
[p autorelease];
}
4)、自动释放池的嵌套使用 :先进后出
@autoreleasepool{
        [p2 autorelease];
       @autoreleasepool{
                [p 1autorelease];
                @autoreleasepool{
                         [p autorelease];
                 }
          }
}
5)、自动释放池中不适宜放占用内存比较大的对象
 1)尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用 
 2)不要把大量循环操作放到同一个 @autoreleasepool 之间,这样会造成内存峰值的上升

四、

好处
(1)不需要再关心对象释放的时间
(2)不需要再关心什么时候调用release

你可能感兴趣的:(14、autoreleasepool)