美文网首页IOS开发知识点
自动释放池什么时候释放?

自动释放池什么时候释放?

作者: 一个半吊子工程师 | 来源:发表于2020-09-16 16:23 被阅读0次
    AutoreleasePool
    • 第一次创建:启动runloop
    • 最后一次销毁:runloop退出时
    • 其他时候的创建和销毁:当runloop即将进行休眠状态时会销毁旧的释放池,并创建一个新的释放池。
    • runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration!
    • 当一个autorelease pool被drain 的时候,会对pool里的每一个对象发送一个release消息;
    • 每一个线程(包括主线程)都有一个AutoreleasePool栈。当一个新的池子被创建的时候,push进栈,当池子被释放内存时,pop出栈。对象调用autorelease方法进入栈顶池子中。当线程结束的时候,会自动地销毁所有跟它有关联的池子;
    • 使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool:
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    // 这里被一个局部@autoreleasepool包围着
    }];
    

    在普通for循环和for in循环中没有,当for循环中便利产生大量autorelease变量时,就需要手动加局部AutoreleasePool

    什么时候用AutoreleasePool:

    • 写给予命令行的程序时,就是没有UI框架;
    • 写循环,循环里边包含了大量临时创建的对象;
    • 创建了新的线程;
    • 长时间在后台运行的任务;
    • 合理运用自动释放池,可以降低程序的内存峰值,异步的方式将文件保存在磁盘(SDWebimage里边异步保存图片到磁盘,类似的占用内存的操作);

    相关文章

      网友评论

        本文标题:自动释放池什么时候释放?

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