美文网首页
14、autoreleasepool

14、autoreleasepool

作者: rebeccaBull | 来源:发表于2019-08-27 21:52 被阅读0次

    一、

    自动释放池
    (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

          本文链接:https://www.haomeiwen.com/subject/koiyectx.html